基本情報技術者試験対策(12)「シフト演算と符号拡張(1)」

スポンサーリンク
IT系

論理シフト

コンピュータの内部では、2進数のデータの桁をずらすことができ、これをシフト(shift) と呼ぶ。 データを上位桁にずらすことを左シフトと呼び、下位桁にずらすことを右シフトと呼ぶ。 シフトによって値が変化するので、シフトは演算の一種である。

シフトによってはみ出した桁は、 消えてなくなる。 シフトして空いた桁は、0で埋められる。 このようなシフトを論理シフトと呼ぶ。 上位桁に論理シフトすることを論理左シフトと呼び、 下位桁に論理シフトすることを論理右シフトと呼ぶ。

例を示す。 下図の (1) は、8ビットの入れ物に格納された 11010111というデータを、 1ビットだけ論理左シフトした結果を示したものである。下図の (2) は、 同じデータを、 1ビットだけ論理右シフトした結果を示したものである。

論理シフトの概要

操作内容特徴
論理左シフト (LSL)左端のビットが捨てられ、右端に 0 が入る1ビットずつ左にずれる
論理右シフト (LSR)右端のビットが捨てられ、左端に 0 が入る1ビットずつ右にずれる

(1) 論理左シフト(Logical Left Shift)

ビット位置76543210
元のデータ11010111
左シフト後10101110

結果: 10101110
→ 左端(MSB)の「1」が捨てられ、右端に「0」が入る。

(2) 論理右シフト(Logical Right Shift)

ビット位置76543210
元のデータ11010111
右シフト後01101011

結果: 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)

ビット位置76543210
元のデータ11010111
右シフト後(算術)11101011

結果: 11101011
→ 左端(MSB)は符号ビットを保持(1のまま)し、右端に「0」が入らない。


シフトごとの結果(10進数換算)

種類操作方向結果ビット列符号付き10進数符号なし10進数説明
元のデータ11010111-41215
論理左シフト (LSL)10101110−82174左に1ビット移動、右端に0を入れる。最上位ビットが変わるため符号も変化。
論理右シフト (LSR)01101011+107107左端に0を入れるため、符号付きでは正の数になる。
算術右シフト (ASR)11101011−21235左端の1(符号ビット)を保持して右にずらすため、負のまま。

(補足)Windowsの電卓を使って8ビットの 11010111 を1ビット論理左シフトした結果を確認する方法

1. 電卓をプログラマー モードにする

  1. Windowsの電卓アプリを起動する。
  2. 左上のメニューボタン(☰)をクリックする。
  3. メニューから「プログラマー」を選択する。

2. 8ビット表示(BYTE)に設定する

計算が8ビットのデータ型として実行され、結果も8ビットで表示されるように設定する。

  1. 電卓の画面左側、または表示部分のすぐ下にある、ビットサイズを表すボタン群から「BYTE」をクリックして選択する。

3. 2進数入力モードにし、数値を入力する

  1. 基数選択ボタンから「Bin」(2進数)をクリックする。
  2. シフトしたい数値「11010111」を入力する。

4. 1ビット論理左シフトを実行する

  1. Lsh」(左シフト)ボタンを押す。
  2. シフトする桁数「1」を入力する。
  3. =」(イコール)ボタンを押して計算を実行する。

5. 結果を確認する

電卓に表示される結果は以下の通りである。

$$\mathbf{10101110}$$


算術右シフトでマイナスの値が1/2になる例

「1/2」という操作(算術右シフト)が厳密な数学的な除算(x/2の商の整数部分)と一致するのは、正の数すべてと、負の偶数に限られる。

元のデータ

ビット列符号付き10進数
11111110−2

算術右シフトでは 符号ビット(左端)を保持 して右に1ビットシフトする。

元のビット列11111110
右シフト後11111111

算術右シフト(ASR)の結果

ビット列符号付き10進数
11111111−1

参考)情報処理教科書 出るとこだけ!基本情報技術者[科目A][科目B]2025年版

コメント

タイトルとURLをコピーしました