マナビング基本情報技術者

左シフトと加算を組み合わせて正の整数を10倍にする手順の確かめ方

基本情報技術者試験 平成29年度秋期 午前 問1 / 基礎理論 › 離散数学

過去問にチャレンジ

平成29年度秋期 午前 問1

数値を2進数で表すレジスタがある。このレジスタに格納されている正の整数xを10倍にする操作はどれか。ここで,桁あふれは起こらないものとする。

  1. ア

    xを2ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。

  2. イ

    xを2ビット左にシフトした値にxを加算し,更に2ビット左にシフトする。

  3. ウ

    xを3ビット左にシフトした値と,xを2ビット左にシフトした値を加算する。

  4. エ

    xを3ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。

会話形式の解説

講師講師
今回は、左シフトと加算を組み合わせて、レジスタの値を10倍にする手順を選ぶ問題です。注目点は「何ビット左にシフトすると何倍になるか」です。桁あふれは起こらないという条件もあるので、シフトを素直に掛け算として読み替えられます。
受験者受験者
1ビット左にシフトすると2倍になる、というのは覚えています。2ビットなら、2を足して4倍でしょうか。それとも2×2で4倍ですか。いつも計算の筋道があいまいになります。
講師講師
結果はどちらも4倍ですが、考え方は掛け算です。1ビットごとに2倍されるので、nビットの左シフトは2のn乗倍になります。3ビットなら2×2×2で8倍です。では、2ビット左シフトしてxを足し、さらに1ビット左シフトする手順は何倍になるでしょうか。
受験者受験者
2ビット左シフトで4x、xを足して5x、最後に1ビット左シフトで2倍なので10xです。これが10倍になりますね。
講師講師
そのとおりです。式にすると(4+1)×2=10です。ほかの選択肢も同じ方法で確かめましょう。前半は同じで、最後だけ2ビット左シフトする手順はどうですか。
受験者受験者
5xまでは同じで、最後が4倍なので20xです。最後のシフト量が違うだけで倍率が2倍ずれるんですね。
講師講師
はい。次に、3ビット左シフトした値と2ビット左シフトした値を足す手順はどうでしょう。
受験者受験者
8x+4xで12xです。x自体を足していないので、10xより2x多くなります。
講師講師
正確です。最後に、3ビット左シフトしてxを足し、さらに1ビット左シフトする手順です。
受験者受験者
8xにxを足して9x、それを2倍して18xです。最初のシフトを3ビットにすると、10倍を通り越してしまいます。
講師講師
これで、ちょうど10倍になるのは「2ビット左シフト、xを加算、1ビット左シフト」の手順だけだと確かめられました。ポイントは、操作の順に倍率を掛けたり足したりして、最終的な倍率を出すことです。
受験者受験者
目的の10を、10=(4+1)×2のように2の累乗の和と積に分けて考えればよいのですね。
講師講師
はい。補足すると、10倍は8x+2x、つまり3ビット左シフトした値と1ビット左シフトした値の和でも作れます。手順は1通りとは限らないので、見覚えのある形を探すより、選択肢ごとに倍率を計算するのが確実です。なお、nビットの右シフトは2のn乗で割ることに当たる点もあわせて押さえておきましょう。

まとめ

2進数では、nビットの左シフトで値が2のn乗倍になります。そのため、シフトと加算を組み合わせれば、2の累乗ではない10倍のような定数倍も作れます。xを2ビット左シフトして4x、xを足して5x、さらに1ビット左シフトすると10xになります。ほかの手順は、それぞれ20x、12x、18xになり、10倍にはなりません。操作の順に倍率を計算していけば、選択肢を確実に見分けられます。

解答・解説

正解はアです

この問題のテーマ

左シフトが値を何倍にするかを使い、加算と組み合わせて正の整数xを10倍にする手順を選ぶ問題です。

解き方の考え方

2進数では、1ビット左にシフトするたびに値が2倍になります。そのため、nビット左にシフトすると2のn乗倍です。桁あふれは起こらないという条件があるので、各選択肢を「シフト=2の累乗を掛ける」と読み替えて、最終的な倍率を計算します。倍率がちょうど10になる選択肢が正解です。

選択肢ごとの解説

  1. ○ア  xを2ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。
    アの「2ビット左シフト→xを加算→1ビット左シフト」を順に計算します。xを2ビット左にシフトすると4x、これにxを足すと5x、最後に1ビット左にシフトすると5x×2=10xです。検算として、(4+1)×2=10となり、10倍の操作になっていることが確かめられます。
  2. ×イ  xを2ビット左にシフトした値にxを加算し,更に2ビット左にシフトする。
    イは、アと同じく5xまでは作れます。しかし最後のシフトが2ビットなので4倍になり、5x×4=20xです。10倍にはなりません。
  3. ×ウ  xを3ビット左にシフトした値と,xを2ビット左にシフトした値を加算する。
    ウの「3ビット左シフトの値と2ビット左シフトの値の加算」は、8x+4x=12xです。xそのものを足していないので、10倍とは2x分ずれた結果になります。
  4. ×エ  xを3ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。
    エは、xを3ビット左にシフトした8xにxを足して9xとし、さらに1ビット左にシフトするので9x×2=18xです。10倍にはなりません。

補足

10倍は8x+2x、つまり「3ビット左シフトした値と1ビット左シフトした値の和」としても作れます。同じ倍率でも手順は1通りとは限らないので、選択肢ごとに倍率を計算して確かめるのが確実です。

POINT

  • nビットの左シフトは値を2のn乗倍にし、nビットの右シフトは2のn乗で割ることに当たります。
  • シフトと加算を組み合わせると、2の累乗ではない定数倍も作れます。
  • 10=(4+1)×2のように、目的の倍率を2の累乗の和と積に分けて考えると、手順を組み立てやすくなります。
  • 選択肢は操作の順に倍率を掛けたり足したりして、最終的な倍率を確かめます。

※出典:平成29年度秋期 基本情報技術者試験 午前 問1