関数binaryToIntegerは,1桁以上の符号なし2進数を文字列で表した値を引数binaryStrで受け取り,その値を整数に変換した結果を戻り値とする。例えば,引数として“100”を受け取ると,4を返す。プログラム中のa,bに入れる字句の適切な組合せはどれか。 〔プログラム〕 ○整数型: binaryToInteger(文字列型: binaryStr) 整数型: integerNum, digitNum, exponent, i integerNum ← 0 for (i を 1 から binaryStr の文字数 まで 1 ずつ増やす) digitNum ← binaryStr の末尾から i 番目の文字を整数型に変換した値 // 例: 文字“1”であれば整数値1に変換 exponent ← [ a ] integerNum ← [ b ] endfor return integerNum
令和6年度 ITパスポート試験 問85
この問題の解説と、これまでの解答の記録です。
問 85
不正解ア
a の「(2のi乗)−1」が誤り。末尾からi番目の桁の重みは2の(i−1)乗であって(2のi乗)−1ではない(例: i=1なら重みは1だが、この式では2−1=1とたまたま合うが、i=2では2のはずが3になる)。さらに b の「integerNum×digitNum×exponent」も誤りで、各桁を掛け合わせると初期値0のため結果が常に0になり変換できない。a・b ともに不適。
不正解イ
b の「integerNum+digitNum×exponent」は正しい累積加算だが、a の「(2のi乗)−1」が誤り。末尾からi番目の桁の重みは2の(i−1)乗(i=1で1、i=2で2、i=3で4)であり、(2のi乗)−1(i=2で3、i=3で7)では桁の重みが合わず、“100”を入れても4にならない。
不正解ウ
a の「2の(i−1)乗」は正しい桁の重みだが、b の「integerNum×digitNum×exponent」が誤り。integerNum は初期値0なので、掛け算で更新すると毎回0が掛かり続け、戻り値が常に0になってしまう。正しくは桁ごとの寄与を足し込む加算でなければならない。
- エ
正解 2進数では右端(末尾から1番目)の桁の重みが2の0乗、その左が2の1乗…と増えていくので、末尾からi番目の桁の重みは「2の(i−1)乗」。これが a に入る(exponent ← 2の(i−1)乗)。各桁ではその桁の値digitNumに重みexponentを掛けた分を合計に足し込むので、b は「integerNum+digitNum×exponent」となり、累積加算で全体の値が求まる。実際に“100”を入れると、i=1で重み1×0=0、i=2で重み2×0=0、i=3で重み4×1=4となり、integerNumは4。設問の戻り値4と一致するので、組合せはエが正しい。
- 符号なし2進数の各桁の重みは、末尾(最下位)からi番目で2の(i−1)乗。最下位桁が2の0乗=1から始まる位取りを押さえる。
- 桁ごとの値×重みを合計に「足し込む」累積加算パターン(integerNum ← integerNum + 項)で総和を求める。初期値0に掛け算をしても0のままになる点に注意。