ITパスポート試験 - 令和6年 - 問85
関数 binaryToInteger は,1桁以上の符号なし2進数を文字列で表した値を引数 binaryStr で受け取り,その値を整数に変換した結果を戻り値とする。例えば,引数として「100」を受け取ると,4を返す。プログラム中の a,b に入れる字句の適切な組合せはどれか。
〔プログラム〕
〔プログラム〕
| a | b | |
| ア | (2の i 乗) - 1 | integerNum × digitNum × exponent |
| イ | (2の i 乗) - 1 | integerNum + digitNum × exponent |
| ウ | 2の (i - 1) 乗 | integerNum × digitNum × exponent |
| エ | 2の (i - 1) 乗 | integerNum + digitNum × exponent |
答え : エ
分野 : テクノロジ系 › 基礎理論 › アルゴリズムとプログラミング › アルゴリズムとプログラミング
解説 :
「2進数の文字列」を「10進数の数値」に変換するプログラムです。たとえば “100” という文字列を受け取ったら,これを2進数として解釈し 4 という整数を返す,という処理です。
例:“100” の場合
合計:0+0+4 = 4 → 問題文の例と一致します。
つまり,このプログラムがやりたいことは,
① 文字列の右から1文字ずつ取り出す
② その文字を数値に変換する(digitNum)
③ その桁の重み(exponent)を計算する
④ 「文字の値 × 重み」を積み上げていく(integerNum)
という処理です。
は,ループの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についての選択肢を検討すると:
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
の組み合わせである「エ」が正解です。
分野 : テクノロジ系 › 基礎理論 › アルゴリズムとプログラミング › アルゴリズムとプログラミング
解説 :
「2進数の文字列」を「10進数の数値」に変換するプログラムです。たとえば “100” という文字列を受け取ったら,これを2進数として解釈し 4 という整数を返す,という処理です。
2進数→10進数変換の仕組みをおさらい
2進数の各桁は,右から順に「2の0乗(=1)」「2の1乗(=2)」「2の2乗(=4)」…という重みを持っています。各桁の数字にその重みをかけて,全部足し合わせると10進数になります。例:“100” の場合
| 桁(右から) | 数字 | 重み | 数字×重み |
|---|---|---|---|
| 1番目(一番右) | 0 | 2⁰=1 | 0 |
| 2番目 | 0 | 2¹=2 | 0 |
| 3番目(一番左) | 1 | 2²=4 | 4 |
つまり,このプログラムがやりたいことは,
① 文字列の右から1文字ずつ取り出す
② その文字を数値に変換する(digitNum)
③ その桁の重み(exponent)を計算する
④ 「文字の値 × 重み」を積み上げていく(integerNum)
という処理です。
aの選択肢を考える(重みの計算)
プログラム中のは,ループの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
の組み合わせである「エ」が正解です。