はじめに
基本情報技術者試験の科目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文字目の文字)
) は、次の流れを実現している。
result
を2倍する → すでに処理した部分を 1桁左にシフト- 現在の桁を加算する → 新しいビットを加える
この計算方法は 左から順に処理していく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文字目の文字)
(選択肢エ) が 正解であると分かる。
基本情報技術者試験では、このようにシンプルながら本質を問う問題が出題される。アルゴリズムの理解を深め、スムーズに解けるようにしておこう!
コメント