数値を2進数で格納するレジスタがある。
このレジスタに正の整数xを設定した後,“レジスタの値を2ビット左にシフトして,xを加える”操作を行うと,レジスタの値はxの何倍になるか。
ここで,あふれ(オーバフロー)は,発生しないものとする。
正答3
解説
正解は3です。
2進数では、1ビット左にシフトするごとに値が2倍になります。
この性質を使って、操作後の値がxの何倍になるかを求めます。
【計算】
2ビット左シフトは2倍を2回行うことなので、x×2×2=4xです。
これにxを加えると、4x+x=5xです。
オーバフローは起きない前提なので、値はxの5倍です。
【選択肢別解説】
1:× 3倍になるのは、1ビット左シフトした2xにxを加えた場合です。
2ビットシフトなので4xにxを加えます。
2:× 4倍は2ビット左シフトしただけの値です。
さらにxを加えるので4倍では止まりません。
3:○ 4x+x=5xとなるので、レジスタの値はxの5倍です。
4:× 6倍にするには、4xに2xを加える必要があります。
加えるのはxなので6倍にはなりません。
【ポイント】
左シフトと加算を組み合わせると、乗算を高速に行えます。
nビットの左シフトは2のn乗倍、右シフトは2のn乗分の1になることを押さえておきましょう。