基本情報技術者 2013年 春期 午前(科目A) 問01
問題文
16ビットの2進数nを16進数の各桁に分けて、下位の桁から順にスタックに格納するために、次の手順を4回繰り返す。a, bに入る適切な語句の組合せはどれか。ここで、は16進数XXXXを表す。
〔手順〕
(1) [ a ]をxに代入する。
(2) xをスタックにプッシュする。
(3) nを[ b ]論理シフトする。

選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
下位桁の抽出と論理シフト【午前解説】
正解の理由
正解: イ
手順の目的は「下位の桁から順に」4ビットずつ取り出してスタックに格納することです。
手順の目的は「下位の桁から順に」4ビットずつ取り出してスタックに格納することです。
- a に n AND 000F_16 を代入すれば、n の下位4ビット(最下位ニブル)だけが得られます。
- それをスタックにプッシュすれば下位桁が保存されます。
- 次に n を右に4ビット論理シフト(符号ビットを詰めない)すると、元の上位側の次のニブルが下位位置に移動し、同様に取り出せます。
この3操作を4回繰り返せば、16ビットを下位から上位へ順にニブル単位でスタックに格納できます。
解法ステップ
- 初期状態として 16ビットの n を用意する(例: )。
- 4 回繰り返すループを開始する(16ビット÷4ビット = 4回)。
- 各反復で a = n AND を計算し、a をスタックにプッシュする。
- n を右に4ビット論理シフトする(n = n >> 4 として0で埋める)。
- ループ終了後、スタックには下位から順に各ニブルが格納されている。
疑似コード例:
stack = []
for i in range(4):
a = n & 0x000F # 下位4ビット抽出
stack.append(a) # プッシュ
n = (n >> 4) & 0x0FFFF # 右に4ビット論理シフト(上位を0で埋める)
選択肢別の誤答解説
- ア(a = n AND 000F_16 / b = 左に4ビット)
一見 a の取り出しは正しいが、その後に左シフトすると次のニブルが下位に来ないため順序取得に失敗します。 - イ(a = n AND 000F_16 / b = 右に4ビット)
正解。下位ニブルを抽出してプッシュし、右論理シフトで次のニブルを下位へ移動させる手順が目的通りです。 - ウ(a = n AND FFF0_16 / b = 左に4ビット)
a に代入されるのは下位4ビットが0になった値で、ニブル単位の値にならないうえ左シフトでさらに位置が崩れます。 - エ(a = n AND FFF0_16 / b = 右に4ビット)
AND で下位が0のままの値をプッシュするため、期待する「ニブルの値」を順に格納できません。右シフトしても毎回低位は0が入ったままになります。
よくある誤解
- 「FFF0_16 を AND すれば上位ニブルが得られるから正しい」:FFF0 をそのまま a に代入すると下位4ビットは0のままになり、取り出した値がニブル単位の値になりません。
- 「左シフトにすれば次のニブルが下位に来る」:左シフトは低位を0にし上位へ移動するため、次のニブルは下位に来ず目的と逆になります。
- 「右シフトは算術シフトでも良い」:算術シフトは符号拡張を行う可能性があり、論理的に0を詰める右論理シフトでなければ上位ビットが汚染されます。
補足コラム
- 「ニブル(nibble)」は4ビット単位の意味で、16進数1桁に相当します。16ビットをニブル単位で扱うとちょうど4回の繰り返しになります。
- 論理シフト(右論理シフト)は常に上位ビットに0を詰めますが、算術シフト(符号付き右シフト)は符号ビットを複製するため、符号付き表現では使えないことが多い点に注意してください。
- スタックにプッシュする順序を逆にすれば上位から格納することも可能ですが、問題文の目的は「下位の桁から順に」なので右シフト+下位マスクが自然な方法です。
FAQ
Q1. なぜ 000F_16 を使うのですか?
A1. 000F_16(= 0x000F)は下位4ビットだけを1にするマスクです。AND を取ることで下位ニブルだけを残せます。
A1. 000F_16(= 0x000F)は下位4ビットだけを1にするマスクです。AND を取ることで下位ニブルだけを残せます。
Q2. 右にシフトするときに算術シフトと論理シフトの違いは重要ですか?
A2. はい。論理シフトは常に0で埋めるため安全ですが、算術シフトは符号ビットを複製するので高位に1が入り込み誤動作します。問題文に「論理シフト」と明示があるのはこのためです。
A2. はい。論理シフトは常に0で埋めるため安全ですが、算術シフトは符号ビットを複製するので高位に1が入り込み誤動作します。問題文に「論理シフト」と明示があるのはこのためです。
Q3. 16以外のビット幅でも同じですか?
A3. はい。ビット幅が の場合は k 回繰り返せば全ニブルを取り出せます。幅が4の倍数でない場合は余りの処理が必要です。
A3. はい。ビット幅が の場合は k 回繰り返せば全ニブルを取り出せます。幅が4の倍数でない場合は余りの処理が必要です。
関連キーワード: ビット演算、マスク、論理シフト、ニブル、スタック、16進数

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

