シフト演算とは、ビット列を左右に動かす(シフトする)演算のこと。
論理シフト
なかでも論理シフトは、ビットをずらすだけ。左に1ビットシフトする場合、値は2倍になる。逆に右に1ビットシフトすると半分になる。
例えば、10進数の8を2進数で表すと00001000。これを右1ビットシフトすると以下になる。
00001000
↓(右に1ビットシフト)
()0000100(0)
↓(右端のはみ出た「0」はカット。左端の空欄には「0」を入れる)
00000100
「00000100」は、10進数では4であり、もともとの8の半分になっている。
算術シフト
符号ビットを考慮した論理シフトを算術シフトという。基本情報技術者試験では、符号ビットを除いたビットをシフト移動させることが多いという。
最上位ビットが符号ビットであり、0はプラス、1はマイナスを表す。
例えば10進数の「-8」を8ビットの2進数で表すと、2の補数表現をつかうので「11111000」となる。これを1ビットだけ算術右シフトすると半分になる。この時、最上位の符号ビットは動かさない。
11111000
↓(1ビット算術右シフト。最上位ビットの符号ビットは固定)
1()111100(0)
↓(最下位ビットの0を削除。空いたビットに符号ビットをコピーする)
11111100
ちなみに「11111100」はマイナスの数。値を出すには2の補数表現で正の数を出さなければならない。
11111100
↓(反転)
00000011
↓(1を足す)
00000100
「00000100」は10進数の4。その補数である「11111100」は10進数の「-4」。「-8」の半分(×1/2)の数である。算術右シフトをすると半分(×1/2)になることの証明。
2の倍数以外の算術左シフトの場合
算術左シフトを行うと、2倍、4倍、8倍と2の倍数ごと増やす計算を行える。
たとえば3倍増やす計算をするときには、算術左シフトと元の数を足すことで求められる。
整数mがレジスタに2進数として入っている。これを3ビット左にシフトしたものにmを加えると、結果は元のmの何倍になるか。ここで、あふれが生じることはないものとする。
ア:4 イ:7 ウ:8 エ:9
2進数の場合、3ビット左シフトすると、2×2×2=8で8倍。さらに「m」を加えるので9倍となり、答えは「エ」ということになる。
2のべき乗分の1以外の算術右シフトの場合
算術右シフトの場合は、算術左シフトの場合と異なり、2のべき乗分の1以外の計算はできない。1/2、1/4、1/8、1/16といったものだけしかできない。
コメント