戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2012年 秋期 午前(科目A)01


問題文

8ビットの2進数11010000を右に2ビット算術シフトしたものを、00010100から減じた値はどれか。ここで、負の数は2の補数表現によるものとする。

選択肢

00001000
00011111
00100000(正解)
11100000

🔒 解説は解答すると表示されます

算術右シフトと2の補数【午前解説】

正解の理由

与えられた 8 ビット値 11010000 を算術右シフト 2 ビットすると上位に符号ビット(1)が入るため 11110100 になり、これは 2 の補数表現で を表します。問いは「00010100(=20)からその値を減じる」つまり であるため、結果は 、すなわち 8 ビット二進数で 00100000 になります。したがって正しい選択肢は です。

解法ステップ

  1. 元の 8 ビット値を確認:11010000(符号付き二の補数)。
  2. 算術右シフト 2 ビットを適用(符号ビットで埋める):
    • 11010000 >> 2(算術) = 11110100
  3. 11110100 を 2 の補数として解釈:
    • 符号ビットは 1 → 負の数
    • 絶対値を求めるため反転+1:11110100 の反転 00001011、+1 → 00001100(=12)
    • よって値は (または unsigned 0xF4 = 244 → 244 − 256 = −12)
  4. 求める演算は 00010100(=20)から上の値を減じる:
    • 20 − (−12) = 20 + 12 = 32
    • 32 を 8 ビット二進数で表すと 00100000
計算をビット操作で示すと:
11010000 >>2 (算術) -> 11110100  (= -12)
00010100 - 11110100  = 00010100 + 00001100 = 00100000 (= 32

選択肢別の誤答解説

  • ア: 00001000(=8)
    • 8 が出るケース:もし右シフトを「論理右シフト」と誤解し、11010000 を 00 で埋めて 00110100(=52)や別処理をした後に誤った引き算をすると出る可能性があるが、本問では算術シフトが指定されている。
  • イ: 00011111(=31)
    • 31 は 20 + 11 の結果で、シフト後の値を −11 と誤認すると得られる。シフト後の値(11110100)が −12 であることを見落とすタイプのミス。
  • : 00100000(=32)
    • 正解。算術シフトによる sign-extension と、二の補数での負数扱いにより得られる正しい結果。
  • エ: 11100000(=−32)
    • 符号を考えずに単純にビット列の並べ替えや、引き算の順序を逆にしてしまうと得られる。引き算の向き(「AをBから減じる」)を取り違えるミス。

よくある誤解

  • 算術シフトと論理シフトの混同:算術シフトは符号ビットで埋める(負数なら1で埋める)、論理シフトは常に0で埋める。符号付き整数では算術シフトを用いる点を忘れないこと。
  • 右シフトは単純な除算ではない:算術右シフトは 2 のべき乗での除算に相当するが、負数では端数処理(丸め方)が異なる。二の補数で表現された負数を右にシフトすると小数点以下は「切り捨て(負方向への丸め)」に相当する場合があるため、言語仕様と混同しない。
  • 8 ビット二の補数の表現範囲の誤認:8 ビットの二の補数で表現できる値域は −128 〜 +127 であり、±127 という表現は誤りである。

補足コラム

  • 算術右シフトと除算の関係:正の数では算術右シフトは符号なし除算と同じ結果(商を切り捨て)になるが、負の数では「丸め方向」が問題になる点に注意してください。例: を 1 ビット算術右シフトすると を負の無限方向に丸めると )になります。
  • 二の補数での減算は加算で処理可能:A − B = A + (B の二の補数)。本問では減算対象が負数だったため「引く(−12)」=「足す(+12)」と考えるほうが早いことが多いです。

FAQ

Q. 算術右シフトで符号ビットを埋めるのはなぜですか?
A. 符号付き整数の値(正負)を保つためです。符号ビット(MSB)をコピーすることで、シフト後も正負の意味が維持されます。
Q. 「00010100から減じる」の順序はどう解釈する?
A. 「XをYから減じる」は Y − X を意味します。本問では「(シフト後の値)を、00010100から減じる」なので 00010100 − (シフト後の値) です。
Q. 8 ビットで表現できる範囲はいくつ?
A. 2 の補数表現では から 、つまり −128〜+127 です。

関連キーワード: 2の補数、算術シフト、符号付き整数、ビット演算、オーバーフロー、丸め処理
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について