基本情報技術者 2012年 秋期 午前(科目A) 問01
問題文
8ビットの2進数11010000を右に2ビット算術シフトしたものを、00010100から減じた値はどれか。ここで、負の数は2の補数表現によるものとする。
選択肢
ア:00001000
イ:00011111
ウ:00100000(正解)
エ:11100000
8ビット2進数の算術シフトと減算の計算問題【午前2 解説】
要点まとめ
- 結論→ 11010000 を算術右シフト2ビットで得る 11110100 を 00010100 から減じると 00100000(ウ)になります。これは の結果です。
- 根拠→ 算術シフトは符号ビットを複製して右に移動するため 、2の補数表現で と評価されます。
- 差がつくポイント→ 算術シフトと論理シフトの違い、2の補数での負数変換(反転+1)、および減算の「順序」を確実に確認すること。
正解の理由
与えられた操作は「11010000 を右に2ビット算術シフトしたものを、00010100 から減じる」つまり
00010100 − (11010000 を算術右シフト2) を計算する問題です。
手順は次のとおりです。
手順は次のとおりです。
- 算術右シフト2ビット:11010000 >> 2 = 11110100(符号ビット1を詰める)
- 11110100 を 2の補数表現で解釈すると負数で、符号反転して 00001011、+1 → 00001100 = 12、つまり 11110100 = −12
- 00010100 は 16+4 = +20
- よって 20 − (−12) = 32 → 8ビットで表すと 00100000
したがって正解は ウ の 00100000 です。
よくある誤解
- 算術シフトと論理シフトを混同する:符号ビットを保持しない論理シフトを使うと誤答になります。
- 2の補数の求め方で「+1」を忘れる:反転のみで終えると符号がずれて誤差が出ます(−11 と誤認など)。
- 減算の順序を逆にする:被減数と減数を逆にすると符号が逆になり全く違う答えになります(例:11100000 など)。
解法ステップ
- 問題文を正確に把握:式は「00010100 − (11010000 >> 2(算術))」であることを確認。
- 算術右シフトを行う:11010000 → 1を詰めて右へ2ビット → 11110100。
- 11110100 を 2の補数負数として解釈:反転 00001011、+1 → 00001100(=12)→ 値は −12。
- 00010100 の値を確認:16+4 = +20。
- 減算を行う:20 − (−12) = 32。
- 8ビットで表現:32 = 00100000 → 正解は ウ。
(短い Python 確認例)
a = int('11010000',2)
# 算術右シフト2(符号ビットを保つため 8ビット限定で実装)
if a & 0b10000000:
shifted = ((a >> 2) | (0b11000000)) & 0xFF
else:
shifted = (a >> 2) & 0xFF
res = (int('00010100',2) - shifted) & 0xFF
bin(res) # '0b100000' -> 00100000
選択肢別の誤答解説
- ア: 00001000(8)
どういう間違いか:シフト後の値を誤って +12(00001100)と解釈し、20 − 12 = 8 とした可能性があります。これは 2の補数の符号処理や反転+1 を誤ったケースです。 - イ: 00011111(31)
どういう間違いか:2の補数を取るときに「+1」を忘れ反転のみで −11 と判断し、20 − (−11) = 31 を出してしまった誤りです。 - ウ: 00100000(正解)
正しい計算の流れは本文の「正解の理由」と「解法ステップ」を参照してください。 - エ: 11100000(224 / −32)
どういう間違いか:減算の順序を逆にしてしまった場合(算術シフトした値 − 00010100)や、符号処理の誤りで出る値です。実際、11110100 − 00010100 = 11100000 になります。
補足コラム
- 算術シフト(Arithmetic shift)と論理シフト(Logical shift)の違い:
- 算術右シフトは符号ビット(最上位ビット)を保ったまま右へシフトし、符号付き整数の除算(2で割る)に相当する挙動を近似します。
- 論理右シフトは常に0を詰めます。符号付き負数を扱う場合は通常、算術シフトが正しい選択です。
- 2の補数のポイント:符号ビットが1なら負数。絶対値はビット反転+1で求めます。
- 桁あふれ(オーバーフロー):今回の演算は 8ビットで表現可能な範囲内(±127)なので問題になりませんが、演算時は常に範囲を確認してください。
FAQ
Q1: 算術シフトで「符号ビットを複製する」とは具体的にどうするのですか?
A1: 元の最上位ビット(MSB)を新しく挿入する左側のビット全てにコピーします。右に2ビットシフトなら左側2ビットをMSBで埋めます。
A1: 元の最上位ビット(MSB)を新しく挿入する左側のビット全てにコピーします。右に2ビットシフトなら左側2ビットをMSBで埋めます。
Q2: 2の補数の求め方を短く教えてください。
A2: ビットを全て反転(0↔1)してから 1 を加えるだけです。反転のみで止めないこと。
A2: ビットを全て反転(0↔1)してから 1 を加えるだけです。反転のみで止めないこと。
Q3: 講評として試験での速算のコツは?
A3: 手順を決めて順に処理(シフト→符号判定→2の補数変換→減算)し、小さなメモ欄に途中結果(10進数)を書いておくとミスが減ります。
A3: 手順を決めて順に処理(シフト→符号判定→2の補数変換→減算)し、小さなメモ欄に途中結果(10進数)を書いておくとミスが減ります。
関連キーワード: 2の補数、算術シフト、論理シフト、ビット演算、符号付き整数、8ビット表現、右シフト、減算、符号拡張、負数表示

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

