戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2012年 春期 午前(科目A)02


問題文

非負の2進数倍にしたものはどれか。

選択肢

(正解)

🔒 解説は解答すると表示されます

二進数の3倍演算【午前解説】

正解の理由

与えられた2進数を数値としてXとおくと、 で表されます。
左に1ビットシフト(末尾に0を付ける)した数は に相当します。したがって です。2Xはb1b2...bn0、Xはb1b2...bnに対応するため、3倍は「b1b2...bn0とb1b2...bnの和」で表せます。よって正解は です。
例:b=101(10進で5)なら
2X = 1010 (10進で10)、X = 0101 (5) → 和 = 1111 (15) = 3×5

解法ステップ

  1. 問題の2進数を数値Xとして定義する。
  2. 左に1ビットシフト(末尾に0を付加)した表現が2Xに相当することを確認する。
  3. 3X = 2X + Xを使い、問題の選択肢のどれが2X + Xを表しているかを判定する。
  4. 加算後に桁上がりが発生しても式は成り立つため、結果のビット長増加を受け入れて正解を確定する。

選択肢別の誤答解説

  • : b1b2 ... b_n0 + b1b2 ... b_n
    正解。前半が2X、後半がXであり2X+X=3Xを満たす。桁上がりが起きても算術的に正しい。
  • イ: b1b2 ... b_n00 - 1
    これは4X - 1に相当し、一般には3Xとは異なる。等しくなるのはX=1の特殊ケースのみ(例外)。
  • ウ: b1b2 ... b_n000
    末尾に000を付けるのは8X(=2^3 X)であり3Xとは全く異なる。
  • エ: b1b2 ... b_n1
    末尾に1を付けるのは2X + 1で、常に3Xになるわけではない(Xに依存するずれがある)。
具体例(b=101 = 5)で確認すると:
ア: 1010 (10) + 0101 (5) = 1111 (15) → 正しく3×5
イ: 10100 (20) - 1 = 10011 (19) → 19 ≠ 15
ウ: 101000 (40) → 40 ≠ 15
エ: 1011 (11) → 11 ≠ 15

よくある誤解

  • 「末尾に0や1を付けること=単なる文字列操作」と見なして、加算で生じる桁上がりを無視する。
  • 4倍や8倍に相当する末尾0複数付加(00や000)を3倍と混同する。
  • 特殊ケース(X=0やX=1)だけを見て一般解と誤認する(例えば4X-1=3XはX=1の特殊解に過ぎない)。

補足コラム

  • ビット演算的には「左シフト」は高速に乗算(2倍,4倍...)を表現できます。3倍はシフトと加算の組合せ(X<<1 + X)で実装するのが典型です。
  • 実装例(Python):
def triple_binary(bin_str):
    # bin_strは 'b1b2...bn' のような文字列
    x = int(bin_str, 2)
    return format((x << 1) + x, 'b')  # 左シフトで 2x、+x で 3x
print(triple_binary('101'))  # -> '1111'
  • 桁上がりがあるため、出力ビット長は元のnビットよりn+1ビット以上になることがある点に注意してください。

FAQ

Q1: 「b1b2...bn0 + b1b2...bn」の表記は文字列の連結と混同してよいですか?
A1: いいえ。これは数値の加算を表します。左側は2X、右側はXなので算術的な合計を意味します。
Q2: 元の数が0の場合はどうなりますか?
A2: X=0のとき2X+X=0であり、どの表記(末尾0付加+加算)でも0になります。特例ではありませんが一般式に含まれます。
Q3: 桁上がりで桁数が増えた場合、表現はどうなる?
A3: 増えます。例えば101の場合は4ビット1111になります。演算自体は常に正しいので桁数増加を許容してください。

関連キーワード: 2進数、ビットシフト、左シフト、桁上がり、二進法乗算、シフト加算手法、ビット演算、算術シフト
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について