7

以下の例よりも、アセンブリで2で割るより速い方法はありますか?

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

1 に答える 1

22

もちろん:

sar eax, 1

オペコードは、最上位(符号)ビットがに保持され、で0に設定されるという点でsar異なります。ウィキペディアの算術シフトページには、一般的なコンテキストでのこの操作に関する詳細が示されています。shrsarshr

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は、-1ではなく-2になります。一方、3sar1は1になります。

于 2010-01-10T10:19:16.307 に答える