離散数学 07:シフト演算を掛け算・割り算として読む
シフト演算は、ビット列を左または右へずらす操作です。2進数では桁を1つ左へずらすと2倍、1つ右へずらすとおおむね 1/2 になります。情報処理技術者試験では、論理シフトと算術シフトの違いが重要です。
左シフト
2進数 00001101 は10進数で 13 です。これを1ビット左シフトすると 00011010 になり、10進数では 26 です。つまり2倍です。
ただし、左端からはみ出たビットは失われます。固定ビット幅では、左シフトでオーバーフローが起きることがあります。
論理右シフト
論理右シフトでは、右へずらして空いた左側に 0 を入れます。符号を考えないビット列として扱うときに使います。
例: 00011010 を1ビット論理右シフトすると 00001101 です。
算術右シフト
算術右シフトでは、符号付き数の符号を保つため、空いた左側に符号ビットを入れます。2の補数表現の負数を右シフトするときに重要です。
例: 11111000 を算術右シフトすると、左側には 1 を入れて 11111100 になります。負数の符号を保つためです。
試験での見方
- 左シフト: 2の累乗倍になりやすいが、はみ出しに注意
- 論理右シフト: 左に 0 を入れる
- 算術右シフト: 符号ビットを保つ
- 負数が出たら、論理か算術かを必ず確認する
確認問題
8ビットの 00000111 を2ビット左シフトするとどうなるでしょうか。
00011100 です。10進数では 7×4 = 28 です。