7

在汇编中是否有比下面示例中的更快的除以 2 的方法(带符号)?

...
mov ecx, 2
idiv ecx
push eax #push the result
...
4

1 回答 1

22

当然:

sar eax, 1

操作码的sar不同之处在于shr最高有效(符号)位保留在 中sar,并且在 中设置为 0 shr。Wikipedia 上的Arithmetic shift页面在一般情况下显示了有关此操作的更多详细信息。

请注意,在 2 的补码机器(x86 是)上,这实际上计算floor(eax / 2). 特别是,这意味着对于整数x

  • 对于x = 0,结果为 0
  • 对于x > 0,结果是floor(x / 2)
  • 对于x < 0,结果也是floor(x / 2)-ceil(-x / 2)

后一个结果给出了可能出乎意料的结果。例如,-3 sar 1 的结果是 -2,而不是 -1。另一方面,3 sar 1 结果为 1。

于 2010-01-10T10:19:16.307 回答