汇编快速除以2

8

在汇编中,除以2并保留符号的方法是否比下面示例中的更快?

...
mov ecx, 2
idiv ecx
push eax #push the result
...
1个回答

23
当然可以:
sar eax, 1

sar 操作码与 shr 操作码的区别在于,在 sar 中最高位(符号位)被保留,而在 shr 中它被设置为 0。维基百科上的算术移位页提供了更详细的关于这个操作的一般性背景。

请注意,在二进制补码计算机(如 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。


2
正如Greg所指出的那样,向右移动1位相当于除以2 :-) - Fuzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接