是否有比下例中的符号将符号除以2更快的方法?

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

最佳答案

当然:

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

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

x = 0的
  • ,结果为0
  • x> 0的
  • ,结果为floor(x/2)
  • x ,结果也是floor(x/2)或-ceil(-x/2)
    后一个结果给出的结果可能是意外的。例如,-3 sar 1产生-2,而不是-1。另一方面,3 sar 1结果为1。

    关于组装快速除以2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2036674/

    10-11 04:05