論理シフト
コンピュータの内部では、2進数のデータの桁をずらすことができ、これをシフト(shift) と呼ぶ。 データを上位桁にずらすことを左シフトと呼び、下位桁にずらすことを右シフトと呼ぶ。 シフトによって値が変化するので、シフトは演算の一種である。
シフトによってはみ出した桁は、 消えてなくなる。 シフトして空いた桁は、0で埋められる。 このようなシフトを論理シフトと呼ぶ。 上位桁に論理シフトすることを論理左シフトと呼び、 下位桁に論理シフトすることを論理右シフトと呼ぶ。
例を示す。 下図の (1) は、8ビットの入れ物に格納された 11010111というデータを、 1ビットだけ論理左シフトした結果を示したものである。下図の (2) は、 同じデータを、 1ビットだけ論理右シフトした結果を示したものである。
論理シフトの概要
| 操作 | 内容 | 特徴 |
|---|---|---|
| 論理左シフト (LSL) | 左端のビットが捨てられ、右端に 0 が入る | 1ビットずつ左にずれる |
| 論理右シフト (LSR) | 右端のビットが捨てられ、左端に 0 が入る | 1ビットずつ右にずれる |
(1) 論理左シフト(Logical Left Shift)
| ビット位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 元のデータ | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
| 左シフト後 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
結果: 10101110
→ 左端(MSB)の「1」が捨てられ、右端に「0」が入る。
(2) 論理右シフト(Logical Right Shift)
| ビット位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 元のデータ | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
| 右シフト後 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
結果: 01101011
→ 右端(LSB)の「1」が捨てられ、左端に「0」が入る。
算術シフト
2進数は、 1桁上がると2倍になり、 1桁下がると1/2になる。 このことから、シフトを2倍の乗算や、 1/2の除算の代用とすることができる。 左シフトすれば桁が上がって2倍になり、 右シフトすれば桁が下がって1/2になるからである。
シフトを乗算と除算の代用とする場合は、 2の補数表現を考慮して、シフト前後でデータの符合が変わらないようにする必要がある。このようなシフトを算術シフトと呼ぶ。
算術シフト(Arithmetic Shift)
前提データ
| 項目 | 内容 |
|---|---|
| 元のデータ | 11010111 |
| ビット数 | 8ビット |
| 最上位ビット(MSB) | 符号ビット(符号付きの場合は「1」で負の数) |
算術右シフト(Arithmetic Right Shift)
| ビット位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 元のデータ | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
| 右シフト後(算術) | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
結果: 11101011
→ 左端(MSB)は符号ビットを保持(1のまま)し、右端に「0」が入らない。
シフトごとの結果(10進数換算)
| 種類 | 操作方向 | 結果ビット列 | 符号付き10進数 | 符号なし10進数 | 説明 |
|---|---|---|---|---|---|
| 元のデータ | – | 11010111 | -41 | 215 | – |
| 論理左シフト (LSL) | ← | 10101110 | −82 | 174 | 左に1ビット移動、右端に0を入れる。最上位ビットが変わるため符号も変化。 |
| 論理右シフト (LSR) | → | 01101011 | +107 | 107 | 左端に0を入れるため、符号付きでは正の数になる。 |
| 算術右シフト (ASR) | → | 11101011 | −21 | 235 | 左端の1(符号ビット)を保持して右にずらすため、負のまま。 |
(補足)Windowsの電卓を使って8ビットの 11010111 を1ビット論理左シフトした結果を確認する方法
1. 電卓をプログラマー モードにする
- Windowsの電卓アプリを起動する。
- 左上のメニューボタン(☰)をクリックする。
- メニューから「プログラマー」を選択する。
2. 8ビット表示(BYTE)に設定する
計算が8ビットのデータ型として実行され、結果も8ビットで表示されるように設定する。
- 電卓の画面左側、または表示部分のすぐ下にある、ビットサイズを表すボタン群から「BYTE」をクリックして選択する。
3. 2進数入力モードにし、数値を入力する
- 基数選択ボタンから「Bin」(2進数)をクリックする。
- シフトしたい数値「11010111」を入力する。
4. 1ビット論理左シフトを実行する
- 「Lsh」(左シフト)ボタンを押す。
- シフトする桁数「1」を入力する。
- 「=」(イコール)ボタンを押して計算を実行する。
5. 結果を確認する
電卓に表示される結果は以下の通りである。
$$\mathbf{10101110}$$
算術右シフトでマイナスの値が1/2になる例
「1/2」という操作(算術右シフト)が厳密な数学的な除算(x/2の商の整数部分)と一致するのは、正の数すべてと、負の偶数に限られる。
元のデータ
| ビット列 | 符号付き10進数 |
|---|---|
| 11111110 | −2 |
算術右シフトでは 符号ビット(左端)を保持 して右に1ビットシフトする。
| 元のビット列 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 右シフト後 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
算術右シフト(ASR)の結果
| ビット列 | 符号付き10進数 |
|---|---|
| 11111111 | −1 |
(参考)情報処理教科書 出るとこだけ!基本情報技術者[科目A][科目B]2025年版


コメント