基本情報技術者試験 令和6年度 科目B 公開問題(過去問) 問2 について解説します。
問題
問2 次のプログラム中の〔 〕に入れる正しい答えを、解答群の中から選べ。
関数 convDecimal は、引数として与えられた、“0”と“1”だけから成る、1文字以上の文字列を、符号なしの2進数と解釈したときの整数値を返す。例えば、引数として“10010”を与えると18が返る。
関数 convDecimal が利用する関数 int は、引数で与えられた文字が“0”なら整数値0を返し、“1”なら整数値1を返す。
[プログラム]
○整数型: 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文字目の文字)
ウ result × 2 + int(binary の (length − i + 1)文字目の文字)
エ result × 2 + int(binary の i文字目の文字)
解説・解答
convDecimalの引数 binary には、”0″と”1″だけからなる文字列(例: “10010”)が渡されます。これを2進数とみなして、10進数の整数値に変換して返す関数が convDecimal になります。
convDecimalで利用される補助関数 int は
引数が “0” なら 0 を返す
引数が “1” なら 1 を返す
という、文字を数値にするだけの関数です。
ここでは2進数を左から順に1文字ずつ読んで10進数に変換する方法を考えます。桁の重みで考えると

このことから、次の処理を for文で繰り返すことで2進数を10進数に変換することができます。
・今まで読んだ部分の値を result とする。(resultの初期値は0。)
・次のビットの値を1つ読む。(0 か 1)
・今までの値(result)を2倍して、そこに読んだビットの値を足す。
式で書くと次のようになります。
result ← result × 2 + 読んだビットの値
上記より、プログラムの〔 〕に入るのは、選択肢エの result × 2 + int(binary の i文字目の文字) になります。
例として 2進数 “10010” を左から処理してみます。
binary = “10010”(長さ 5)とし、i を1~5で回します。binary の i文字目は左から i 番目の文字です。result = 0 が初期値です。
1回目(i = 1, 文字は “1”)
result = 0 × 2 + 1 = 1
2回目(i = 2, 文字は “0”)
result = 1 × 2 + 0 = 2
3回目(i = 3, 文字は “0”)
result = 2 × 2 + 0 = 4
4回目(i = 4, 文字は “1”)
result = 4 × 2 + 1 = 9
5回目(i = 5, 文字は “0”)
result = 9 × 2 + 0 = 18
最終的に result = 18 となり、問題文の通りになります。
以上により、この問題の解答は「エ」になります。
