ITパスポート試験 - 令和6年 - 問85

関数 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

ab
(2の i 乗) - 1integerNum × digitNum × exponent
(2の i 乗) - 1integerNum + digitNum × exponent
2の (i - 1) 乗integerNum × digitNum × exponent
2の (i - 1) 乗integerNum + digitNum × exponent
答え
分野 : テクノロジ系 › 基礎理論 › アルゴリズムとプログラミング › アルゴリズムとプログラミング
解説
「2進数の文字列」を「10進数の数値」に変換するプログラムです。たとえば “100” という文字列を受け取ったら,これを2進数として解釈し 4 という整数を返す,という処理です。

2進数→10進数変換の仕組みをおさらい

2進数の各桁は,右から順に「2の0乗(=1)」「2の1乗(=2)」「2の2乗(=4)」…という重みを持っています。各桁の数字にその重みをかけて,全部足し合わせると10進数になります。

例:“100” の場合
桁(右から)数字重み数字×重み
1番目(一番右)02⁰=10
2番目02¹=20
3番目(一番左)12²=44
合計:0+0+4 = 4 → 問題文の例と一致します。

つまり,このプログラムがやりたいことは,
① 文字列の右から1文字ずつ取り出す
② その文字を数値に変換する(digitNum)
③ その桁の重み(exponent)を計算する
④ 「文字の値 × 重み」を積み上げていく(integerNum)
という処理です。

aの選択肢を考える(重みの計算)

プログラム中の
digitNum ← binaryStrの末尾からi番目の文字を整数型に変換した値
は,ループの1回目(i=1)で末尾から1番目(一番右)の文字を取り出す,という意味です。つまり i は「右から何番目か」を表す変数です。

先ほどの表を見ると,右から1番目(i=1)の重みは 2⁰=1,右から2番目(i=2)の重みは2¹=2,右から3番目(i=3)の重みは2²=4 でした。 i番目の重み = 2の(i-1)乗 という関係になっています(iが1のとき指数は0,iが2のとき指数は1…とiより1小さい数が指数になる)。

aについての選択肢を検討すると:
(2のi乗)-1 だと,i=1のとき 2¹-1=1(たまたま合うが,i=2のとき2²-1=3となり重み2と合わない)→ ✕
2の(i-1)乗 だと,i=1のとき2⁰=1,i=2のとき2¹=2,i=3のとき2²=4 → すべて一致 ○
よって aは「2の(i-1)乗」です。

bの選択肢を考える(積み上げ方)

各桁の「文字の値 × 重み」を全部足し合わせるのが2進数→10進数変換のルールでした(表の一番右の列を合計する操作)。

bについての選択肢を検討すると:
integerNum × digitNum × exponent → これは掛け算でどんどん積み上げていく式です。掛け算だと,途中でdigitNumが0(=2進数の桁が0)になった瞬間に,それまで積み上げた値がすべて0になってしまいます。“100” の例では,i=1 で digitNum=0 なので,この時点で integerNumが0×0×1=0 になり,以降も0のままになってしまい,正しく4を計算できません。→ ✕
integerNum + digitNum × exponent → これは各桁の「文字の値×重み」を足し算で integerNum に積み上げていく式です。0の桁があっても他の桁の計算結果には影響しません。→ ○
よって bは「integerNum + digitNum × exponent」です。

以上をまとめると,
 a:2の(i-1)乗
 b:integerNum + digitNum × exponent
の組み合わせである「エ」が正解です。
ホーム画面への追加方法
1.ブラウザの 共有ボタンのアイコン 共有ボタンをタップ
2.メニューの「ホーム画面に追加」をタップ
閉じる