関数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
正答4
解説
正解は4です。
2進数の文字列を整数に変換する関数の空欄a、bを埋める問題です。
2進数では、末尾(右端)から1桁目の重みが1、2桁目が2、3桁目が4のように、2の累乗で増えます。
末尾からi番目の桁の重みは2の(i-1)乗なので、各桁の数字に重みを掛けて合計すれば整数になります。
【計算】
選択肢4を当てはめ、例の“100”をたどります。
最初にintegerNumは0です。
i=1のとき、末尾から1番目の文字は"0"なのでdigitNumは0です。
exponentは2の0乗で1、integerNumは0+0×1=0です。
i=2のとき、末尾から2番目の文字は"0"なのでdigitNumは0です。
exponentは2の1乗で2、integerNumは0+0×2=0です。
i=3のとき、末尾から3番目の文字は"1"なのでdigitNumは1です。
exponentは2の2乗で4、integerNumは0+1×4=4です。
戻り値は4となり、例と一致します。
【選択肢別解説】
1:× bを掛け算にすると、integerNumの初期値が0なので、何を掛けても0のままです。
“100”を渡しても4にならず、0が返ります。
2:× aを(2のi乗)-1にすると、重みがi=1で1、i=2で3、i=3で7となります。
“100”では0+0+1×7=7となり、4になりません。
3:× aは正しいものの、bが掛け算なので、integerNumは0のまま変わりません。
“100”を渡しても0が返ります。
4:○ aを2の(i-1)乗、bをintegerNum+digitNum×exponentとすると、“100”で4が返り、正しく変換できます。
【ポイント】
2進数の各桁の重みは、右から1、2、4、8、16です。
累計を求める処理では「integerNum ← integerNum+値」のように、前の値に足し込む形になります。