1

「sall」命令を使用したアセンブリの左シフトに関する簡単な質問。

私が理解していることから、「sall rightop、leftop」は「leftop = leftop << rightop」に変換されるため、整数を取り、ビット 4 スペースを左にシフトすると、2 ^ 4 が乗算されます。

しかし、整数が符号なしの 32 ビットで、次のような場合はどうなるでしょうか。

1111 1111 1111 1111 1111 0000 0010 0010

この場合、左シフトは 1111 1111 1111 1111 0000 0010 0010 0000 になりますか?

明らかに、これは 2^4 の乗算ではありません。

ありがとう!!

4

2 に答える 2

1

左シフト ( SAL, SHL) は、左側のビットを単純に失います。右側のビットは 0 で埋められます。失われたビットのいずれかが 1 の場合、オーバーフローが発生し、乗算に関して間違った結果が得られます。S*L負でない値と負の値の両方に使用します。

通常の右シフト ( SHR) はまったく同じように機能しますが、方向が逆で、左側のビットが 0 で埋められ、右側のビットが失われます。結果は効果的に 0 に向かって丸め/切り捨てられSHRます。値の符号が保持されない (0 が書き込まれる) ため、負でない値を使用します。

算術右シフト ( SAR) は少し異なります。最上位ビット (= 左端ビット、符号ビット) は 0 で埋められません。以前の値で埋められるため、値の符号が保持されます。もう 1 つの注目すべき違いは、値が負の場合、右側の失われたビットが 0 ではなく負の無限大に向かって丸められることです。

于 2012-10-18T15:03:31.357 に答える
1

2^4これは、モジュロによる乗算2^32です。

n = (n * 2^4) % (2 ^ 32)

この場合、左シフトに続いてマスキングを実行することで、「シフトアウト」されたビットを検出できます。

dropped = (n >> (32-4)) & (1<<4-1)
于 2012-10-18T14:53:00.243 に答える