轮班操作O(1)
还是O(n)
?
计算机通常需要更多操作来转移31个位置而不是移动1个位置是否有意义?
或者有意义的是,无论我们需要移动多少个位置,移位所需的操作数量都是恒定的?
PS:想知道硬件是否是合适的标签..
我很好奇有多少种方法可以在x86汇编中将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少10种方法.
我能想到的是:
xor ax,ax
mov ax, 0
and ax, 0
Run Code Online (Sandbox Code Playgroud) 我们在生产中有一个代码,在某些情况下,它可能会将 32 位无符号整数左移超过 31 位。我知道这被认为是未定义的行为。不幸的是,我们现在无法解决这个问题,但我们可以解决这个问题,前提是我们可以假设它在实践中是如何工作的。
在 x86/amd64 上,我知道用于移位的处理器仅使用移位计数操作数的适当较低有效位。所以这a << b
实际上相当于a << (b & 31)
. 从硬件设计来看,这是完全合理的。
我的问题是:这在现代流行的平台(例如 arm、mips、RISC 等)上如何在实践中工作。我的意思是在现代 PC 和移动设备中实际使用的那些,而不是过时或深奥的。
我们可以假设它们的行为方式相同吗?
编辑:
我正在谈论的代码目前在区块链中运行。它究竟如何工作并不重要,但至少我们希望确保它在所有机器上产生相同的结果。这是最重要的,否则可以利用它来诱导所谓的链分裂。
修复这意味着麻烦,因为修复应该同时应用于所有正在运行的机器,否则我们将再次面临链分裂的风险。但我们会在某个时候以有组织(受控)的方式来做这件事。
各种编译器的问题较小。我们只使用 GCC。我亲眼看了一下代码,里面有shl
说明。坦率地说,鉴于上下文,我不希望它有任何不同(移位操作数来自任意来源,无法在编译时预测)。
请不要提醒我“不能假设”。我知道这个。我的问题是 100% 实用的。正如我所说,我知道在 x86/amd64 上,32 位移位指令仅占用位计数操作数的 5 个最低有效位。
这在当前的现代架构中表现如何?我们还可以将问题限制在 little-endian 处理器上。
是x>>2
不是更快x>>31
?换句话说,sar x, 2
比sar x, 31
? 我做了一些简单的测试,它们似乎具有相同的速度。我将不胜感激任何确凿的证据。