web-dev-qa-db-ja.com

論理右シフト、算術右シフト、右回転の違い

私は古典的なハッカーの喜びを読んでいて、論理右シフト、算術右シフト、右回転の違いを理解するのに苦労しています。疑いが単純すぎるようでしたら失礼します。

Also why is there no arithmetic shift left?

13

最初に、機械語は固定サイズであることを覚えておいてください。 4と言ってください、そしてあなたの入力は:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+

次に、すべてを1ポジション左に押すと、次のようになります。

+---+---+---+---+
| b | c | d | X |
+---+---+---+---+

Xとして何を配置するかを質問しますか?

  1. shiftを付けて0を置く
  2. with rotate put a

次に、すべてを1ポジション右に押します。

+---+---+---+---+
| X | a | b | c |
+---+---+---+---+

Xとして何を配置するかを質問しますか?

  1. 論理シフトを付けて0を置く
  2. 算術シフトを入れてa
  3. with rotate put d

だいたい。

論理シフト 2による(左シフト)乗算、(右シフト)2による整数除算に対応します。

算術シフトは、符号付き数値の2の補数表現に関連するものです。この表現では、符号は左端のビットであり、算術シフトは符号を保持します(これは符号拡張と呼ばれます)。

Rotateは通常の数学的な意味を持たず、コンピューターでもほとんど使用されなくなった操作です。

21

違いは、右端の列でかなり説明されています。

  • 論理シフトは、数値をビットの束として扱い、ゼロにシフトします。これはCの>>演算子です。
  • 算術シフトは、数値を符号付き整数(2の補数)として扱い、最上位ビットを「保持」し、最上位ビットが0の場合はゼロ、1の場合は1にシフトします。 Cの右シフト演算子は、シフトされる数値が負の場合、実装定義の動作をします。

    たとえば、論理シフトを使用して3ビットを右シフトすると、2進数11100101(10進数では-27、2の補数を想定)は00011100(10進数の28)になります。これは明らかに混乱しています。算術シフトを使用すると、符号ビットが保持され、結果は11111100(10進数の-4、-27/8にほぼ適切)になります。

  • 最上位ビットは最下位ビットに置き換えられるため、回転はどちらも行いません。 Cには回転を行う演算子がありません。

6
unwind