この概念が出た関連問題

この試験の対策ガイド

基本情報技術者試験 対策ガイド

合格率・勉強法・参考書の選び方をまとめています

見る →
答えと解説を見る(先に解くのがおすすめ)

正解は エ

解説

2進数文字列を10進数整数に変換するconvDecimal関数の空欄を問う問題です。例:"10010" → 18。変換アルゴリズムの考え方:2進数を10進数に変換する際、右から順に各桁に2のべき乗を掛けて合計する方法が直感的ですが、プログラムでは「左から読みながら順次2倍して足す」ホーナー法(Horner's method)が効率的です。ホーナー法の動作例("10010"):初期値result=0。i=1(文字「1」):result = 0 × 2 + 1 = 1。i=2(文字「0」):result = 1 × 2 + 0 = 2。i=3(文字「0」):result = 2 × 2 + 0 = 4。i=4(文字「1」):result = 4 × 2 + 1 = 9。i=5(文字「0」):result = 9 × 2 + 0 = 18。最終的にresult=18が返ります。プログラム中の空欄は「result × 2 + int(binary の i 文字目の文字)」となり、選択肢Dが正解です。ループは左から右へ(i=1からlengthまで)進み、各ステップで現在値を2倍して新しい桁を加えます。

なぜ他の選択肢は違うのか

選択肢 ア
「result + int(binary の (length-i+1)文字目の文字)」は2のべき乗の重みなしに単純加算しています。例えば"1001"の場合、1+0+0+1=2となりますが正解は9(8+1)です。各桁に2のべき乗(1, 2, 4, 8...)の重みを掛ける必要があります。
選択肢 イ
「result + int(binary の i 文字目の文字)」は重みなしの単純加算です。選択肢aと同様に2のべき乗の重みが反映されません。さらに文字列を左から読む順序は正しいですが、×2の操作なしでは正確な変換ができません。
選択肢 ウ
「result × 2 + int(binary の (length-i+1)文字目)」は乗算部分は正しいですが、文字列を右から読んでいます。(length-i+1)文字目はi=1のとき最右端を指します。左から処理するループに対して右から読む実装では、最初に最下位ビットを処理することになり計算が狂います。

解くときのポイント

2進数→10進数変換のホーナー法:「result = result × 2 + 今の桁の値」を左から順に繰り返す。文字列の左端から読む(i文字目)×2倍して加算する、この組み合わせが正しい実装。選択肢の「×2があるか」「左から読んでいるか」の2点を確認。