ITパスポート過去問 令和6年度(2024年)問85
関数binaryToIntegerは,1桁以上の符号なし2進数を文字列で表した値を引数binaryStrで受け取り,その値を整数に変換した結果を戻り値とする。例えば,引数として“100”を受け取ると,4を返す。プログラム中のa,bに入れる字句の適切な組合せはどれか。


選択肢
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
2進数を整数に変換するには、末尾(右端)からi番目の桁の重みを「2i−1」とし、各桁の値「digitNum×重み」を合計します。したがって、exponentは「2i−1」、integerNumは「integerNum + digitNum × exponent」で更新します。よって正解は「エ」です。
Point
この問題は、2進数の各桁の重み(2のべき乗)と、繰り返し処理で合計値を更新する方法を理解しているかを確認するものです。
解くために必要な知識
この問題を解くには、2進数の位取り(重み)と、ループで合計値を作る計算方法を理解している必要があります。
用語の整理
| 用語名 | 意味 |
|---|---|
| 2進数 | 0と1で数を表す方法です。 |
| 桁の重み | 各桁が持つ値の倍率です。2進数では右端から順に20、21、22…です。 |
| exponent | この問題では「桁の重み」を表す変数です。 |
| 累計 | 途中までの合計に、次の値を足して更新することです。 |
2進数の重み(位取り)
右端(最下位桁)から数えてi番目の重みは次のとおりです。
- 重み = 2i-1
例:binaryStr = "100" の場合(右端から処理)
| i(末尾から) | 文字 | digitNum | 重み exponent | 加える値 digitNum×exponent |
|---|---|---|---|---|
| 1 | 0 | 0 | 20=1 | 0 |
| 2 | 0 | 0 | 21=2 | 0 |
| 3 | 1 | 1 | 22=4 | 4 |
合計は4となります。
ループで整数に変換する基本形
この問題の処理は次の形になっています。
- 合計 = 合計 +(各桁の値 × 重み)
問題の解法手順
解く手順
1. 変数iと「末尾からi番目」の対応を確認します
iは1から増えていき、
-
i=1は末尾(右端)の桁
-
i=2は右から2番目の桁
-
i=3は右から3番目の桁
を表します。
2. exponent(重み)は「2i−1」と決めます
2進数の重みは、右端から順に次のようになります。
| 末尾からの位置i | 重み |
|---|---|
| 1 | 20 = 1 |
| 2 | 21 = 2 |
| 3 | 22 = 4 |
よって、末尾からi番目の重みは「2i−1」なので、
- a = 2i − 1
となります。
3. integerNumは「加算」で更新します
各桁の寄与は「digitNum × exponent」です。
これを累積するので、
- integerNum = integerNum + digitNum × exponent
となります。
4. 例「100」で確認します
"100"を末尾から見ると、i=1が0、i=2が0、i=3が1です。
| i | digitNum | exponent = 2i−1 | 加算する値 digitNum×exponent | integerNum |
|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 |
| 2 | 0 | 2 | 0 | 0 |
| 3 | 1 | 4 | 4 | 4 |
戻り値が4となり、問題文の例と一致します。
選択肢ごとの解説
- ア:不正解
「a」が2i−1なので、重みが1,3,7,…となり、2進数の桁の重み(1,2,4,…)と一致しません。また「b」が掛け算のため、桁ごとの値を合計できません。
- イ:不正解
「b」は加算で合計する形ですが、「a」が2i−1であり、2進数の桁の重み(2i−1)になりません。
- ウ:不正解
「a」は2i−1で桁の重みとして正しいですが、「b」が掛け算のため、桁の寄与を加算して合計する処理になりません。
- エ:正解
「a」が2i−1で末尾からi番目の桁の重みを正しく表します。「b」もintegerNum + digitNum×exponentで、各桁の寄与を加算して合計する処理になっており適切です。
まとめ
2進数を整数に変換するには、末尾(右端)からi番目の桁の重みを「2i−1」とし、各桁の値「digitNum×重み」を合計します。したがって、exponentは「2i−1」、integerNumは「integerNum + digitNum × exponent」で更新します。よって正解は「エ」です。
テクノロジ系 > 基礎理論 > アルゴリズムとプログラミング
「a」が2i−1なので、重みが1,3,7,…となり、2進数の桁の重み(1,2,4,…)と一致しません。また「b」が掛け算のため、桁ごとの値を合計できません。
「b」は加算で合計する形ですが、「a」が2i−1であり、2進数の桁の重み(2i−1)になりません。
「a」は2i−1で桁の重みとして正しいですが、「b」が掛け算のため、桁の寄与を加算して合計する処理になりません。
「a」が2i−1で末尾からi番目の桁の重みを正しく表します。「b」もintegerNum + digitNum×exponentで、各桁の寄与を加算して合計する処理になっており適切です。