基本情報技術者試験 令和6年 科目B 問2「2進数の文字列を整数に変換するプログラム」の考察

FE対策

はじめに

基本情報技術者試験の科目Bでは、プログラムの理解とアルゴリズムの設計力が問われる。
今回は、令和6年公開問題の科目Bに出題された問2「2進数の文字列を整数に変換するプログラム」について考えてみよう。


スポンサーリンク
スポンサーリンク

問題の概要

与えられた文字列が “0” と “1” だけ で構成されている場合、それを 2進数として解釈し、対応する整数を求める ことが求められる。

例えば:
"10010" → 18
"111" → 7
"1010" → 10

これをプログラムで実装する場合、どのように計算すればよいだろうか?


2進数の整数変換の仕組み

2進数を10進数に変換する方法を理解するために、具体例を考えてみよう。

たとえば “10010” を考えると、これは

[
1 \times 2^4 + 0 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 0 \times 2^0
]

となる。計算すると

[
16 + 0 + 0 + 2 + 0 = 18
]

この計算の手順をプログラムで表すと、左から順に処理しながら 「今の値を2倍し、新しい桁を加算する」 という手法が適している。


プログラムの解析

問題のプログラムでは、関数 convDecimal が 2進数の文字列を整数に変換 する役割を担っている。

整数型: convDecimal(文字列型: binary)
整数型: i, length, result ← 0
length ← binaryの文字数
for (i を 1 から length まで 1 ずつ増やす)
    result ← ???
endfor
return result

この ??? の部分に何を入れるべきか が問題のポイントだ。


選択肢の検討

問題の選択肢を見てみよう。

選択肢 処理内容 結果
result + int(binary の (length - i + 1)文字目の文字) 桁位置を考慮していないため誤り
result + int(binary の i文字目の文字) 単に足すだけで、2進数の加重が考慮されていないため誤り
result × 2 + int(binary の (length - i + 1)文字目の文字) 逆順に処理しているため誤り
result × 2 + int(binary の i文字目の文字) 正しい

正しい選択肢の理由

エの選択肢 (result × 2 + int(binary の i文字目の文字)) は、次の流れを実現している。

  1. result を2倍する → すでに処理した部分を 1桁左にシフト
  2. 現在の桁を加算する → 新しいビットを加える

この計算方法は 左から順に処理していく2進数の変換の基本ロジック そのものであり、数学的にもプログラム的にも正しい。


Pythonでの実装

実際のコードに落とし込むと、次のようになる。

def convDecimal(binary):
    result = 0
    for i in range(len(binary)):
        result = result * 2 + int(binary[i])
    return result

# テスト
print(convDecimal("10010"))  # 18
print(convDecimal("111"))    # 7
print(convDecimal("1010"))   # 10

このコードでは、binary を左から1文字ずつ取得しながら、result を更新していく。

処理の流れ(例:”10010″)
1. result = 0
2. 1文字目 "1"result = 0 * 2 + 1 = 1
3. 2文字目 "0"result = 1 * 2 + 0 = 2
4. 3文字目 "0"result = 2 * 2 + 0 = 4
5. 4文字目 "1"result = 4 * 2 + 1 = 9
6. 5文字目 "0"result = 9 * 2 + 0 = 18

結果: 18


まとめ

この問題のポイントは、2進数の変換は「左から順に、既存の値を2倍して新しい桁を加算する」ことで実現できる ということだ。
これにより、result × 2 + int(binary の i文字目の文字)(選択肢エ) が 正解であると分かる。

基本情報技術者試験では、このようにシンプルながら本質を問う問題が出題される。アルゴリズムの理解を深め、スムーズに解けるようにしておこう!

コメント