装配快速划分2

Dav*_*idH 7 assembly division

是否有更快的方式除以2,带符号,在汇编中比下例中的那个?

...
mov ecx, 2
idiv ecx
push eax #push the result
...
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 21

当然:

sar eax, 1
Run Code Online (Sandbox Code Playgroud)

所述sar操作码不同于shr在该最显著(符号)位被保存在sar,并且它是在设置为0 shr.维基百科上的算术转换页面在一般上下文中显示了有关此操作的更多详细信息.

请注意,在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.

  • 究竟.正如Greg指出的那样,向右移动1与2除以相同:-) (2认同)