基本情報技術者 2013年 秋期 午前(科目A) 問02
問題文
32ビットのレジスタに16進数ABCDが入っているとき、2ビットだけ右に論理シフトした値はどれか。
選択肢
ア:2AF3(正解)
イ:6AF3
ウ:AF34
エ:EAF3
32ビットレジスタに16進数ABCDが入っているとき、2ビットだけ右に論理シフトした値はどれか。【午前2 解説】
要点まとめ
- 結論→32ビットレジスタに16進数 0xABCD(上位は0と仮定)が入っている場合、論理右シフト2ビットの結果は 0x2AF3 になります。
- 根拠→16進数を2進数に展開して右に2ビット移動し、空いた上位ビットは0で埋める(論理シフト)と 0b0010 1010 1111 0011 = 0x2AF3 となるためです。
- 差がつくポイント→「ビット単位のシフト」と「16進桁(ニブル)単位の移動」を混同しないこと、論理/算術/回転の違いを正確に区別することが合格点を分けます。
正解の理由
正解: ア
論理右シフトは空いた上位ビットを必ず0で埋めます。レジスタが32ビットで「16進数ABCD」が入っているとは通常 0x0000ABCD を意味するため、これを右に2ビット論理シフトすると 0x00002AF3 となり、提示選択肢の下16ビット表記では 2AF3 が正解です。
論理右シフトは空いた上位ビットを必ず0で埋めます。レジスタが32ビットで「16進数ABCD」が入っているとは通常 0x0000ABCD を意味するため、これを右に2ビット論理シフトすると 0x00002AF3 となり、提示選択肢の下16ビット表記では 2AF3 が正解です。
よくある誤解
- 「右に2ビットシフト=右に1桁(4ビット)シフト」と誤解し、結果を AF34 のように考えてしまう。ビットとニブル(4ビット)の単位を混同しないこと。
- 算術右シフト(符号拡張)やローテート(回転)と混同し、上位ビットに1を埋めたり末尾ビットを先頭に回して 6AF3 や EAF3 とするミス。問題文の「論理シフト」を正しく理解する必要があります。
解法ステップ
- 与えられた16進数をフル32ビット表記で考える(通常は 0x0000ABCD)。
- 16進数を2進数に変換する:0xABCD = 1010 1011 1100 1101(二分ごとに区切る)。
- 右に2ビットシフト(論理)する:空いた上位2ビットに0を入れる → 0010 1010 1111 0011。
- 2進数を4ビット区切りで16進数に戻すと 0x2AF3。
- 選択肢と照合してア(2AF3)が一致することを確認する。
選択肢別の誤答解説
- ア: 2AF3 — 正解。上記の通り論理右シフト2ビットの結果です。
- イ: 6AF3 — 回転(rotate right)2ビットの結果に相当します。下位の2ビットを上位に回す操作を想定すると 0x6AF3 になります。
- ウ: AF34 — 左シフト(左に2ビット)をした場合に下位16ビットだけを見たときに得られる値です(0xABCD << 2 = 0x2AF34 → 下位16ビット AF34)。
- エ: EAF3 — 算術右シフト(符号付きの右シフト)で上位を1で埋めた場合に相当します。元の最上位ビットが1と見なされると、このような塩梅になりますが、問題は論理シフトを要求しています。
補足コラム
- 論理シフト(logical shift):空いたビット位置を常に0で埋める。符号なし整数の除算に対応(右シフトは2のべき乗での除算、切り捨て)。
- 算術シフト(arithmetic shift):符号ビットを保持するために上位を符号ビットで埋める。負の数を保持したままシフトする際に用いる。
- ローテート(rotate):回転操作は演算でビットを捨てずに循環させる。暗号やビット操作で使われる。
- 実装上、CPU命令や言語によって論理/算術/回転の動作が異なるため、問題文の用語を正確に読むことが重要です。
python を使った確認(参考)
x = 0xABCD # 与えられた値(32ビット中の下位16ビット) logical_rshift2 = (x >> 2) & 0xFFFFFFFF hex(logical_rshift2) # '0x2af3'
FAQ
Q1: 「32ビットレジスタに入っている」とあるが、先頭は0でいいのか?
A1: 通常は与えられた16進数のみがレジスタに格納されていると読み、上位は0(0x0000ABCD)と解釈します。問題文で符号拡張や上位ビットの指定がない限りそう扱います。
A1: 通常は与えられた16進数のみがレジスタに格納されていると読み、上位は0(0x0000ABCD)と解釈します。問題文で符号拡張や上位ビットの指定がない限りそう扱います。
Q2: 論理右シフトと算術右シフトの見分け方は?
A2: 問題文に「論理(logical)」とあれば0で埋め、「算術(arithmetic)」や符号に関する指定があれば符号ビットで埋めます。英語表現で "logical shift" / "arithmetic shift" と明記されることが多いです。
A2: 問題文に「論理(logical)」とあれば0で埋め、「算術(arithmetic)」や符号に関する指定があれば符号ビットで埋めます。英語表現で "logical shift" / "arithmetic shift" と明記されることが多いです。
Q3: 右に2ビットシフトは常に1/4になるのか?
A3: 符号なし整数では数学的に floor(x/4) に相当しますが、算術シフトや符号付き整数の解釈、オーバーフローの扱いに注意が必要です。
A3: 符号なし整数では数学的に floor(x/4) に相当しますが、算術シフトや符号付き整数の解釈、オーバーフローの扱いに注意が必要です。
関連キーワード: 論理シフト、右シフト、ビット演算、16進数、回転(ローテート)、算術シフト、シフト演算

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

