【資格の勉強】シフト演算

シフト演算とは、ビット列を左右に動かす(シフトする)演算のこと。

論理シフト

なかでも論理シフトは、ビットをずらすだけ。左に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といったものだけしかできない。

コメント

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