[0221] ビットシフト

平成12年度秋期 (旧)第2情報処理技術者試験より
次の 16ビットの固定小数点レジスタの内容を 2ビット左へ論理シフトしたものを a とし、3ビット右へ論理シフトしたものを b としたとき、a は b の何倍になるか。ここで、論理シフトではシフト後に空きとなったビットに 0 が補われるものとする。

6
12
24
32

正解

解説

 ビットシフトに関する問題です。

 ビットシフトとは、各ビットを左右に移動するさせる(shift;シフト)操作で、高速な乗算、除算に利用されています。どのようにして乗算、除算をおこなうのか、10進数で考えてみましょう。

 例えば、「950」の各桁の値を左に 1桁分だけずらすと、「9500」となり、これは、10( = 101 )で乗算した結果と同じになります。2桁では「95000」となり、100( = 102 )での乗算となります。また、右に 1桁分だけずらすと、「95」となり、10( = 101 )で除算した結果と等しくなります。これは、10-1 で乗算した、ともいえます。

 2進数でも、10進数の場合と同じように考えればよいのです。つまり、
  • 左に nビットシフトすると、値は 2n倍になる
  • 右に nビットシフトすると、値は 2-n倍になる
といえます。

 問題で記述されている論理シフトとは、ビットシフトの一種で 符号なし2進数に適用されるものです。また、算術シフトというものもあります。算術シフトは、符号つき 2進数に適用されます。

 CASL2言語では、論理シフト、算術シフトを次のように定義しています。




 文章のみでは難しく感じるかもしれませんが、それほど複雑な仕組みではありません。図で表すと、以下のようになります。







 それでは、問題を解いていきましょう。

 a は、2ビットの論理左シフトなので、元の値に 22 を乗じたものになります。
 b は、3ビットの論理右シフトなので、元の値に 2-3 を乗じたものになります。

 a は 22倍されているのに対し、b は 2-3倍されているので、a は b の 25倍の大きさとなります。したがって、32 のエが正解となります。
※ 解説の内容は執筆時点のものであり,含まれている情報の正確性,妥当性について保証するものではありません。ご注意ください・・・

関連する(かもしれない)問題