問2 足すと 0 になる 8 ビットの値 (2 の補数)

基本情報​技術者試験 令和8年度 公開問題 科目B、全6問のうちの問2。

出典:令和8年度 基本情報技術者試験 公開問題 科目B 問2(プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。空欄は[  ]で表した。排他的論理和の記号は原本の形に近い ▽ で書いた)

次のプログラム中の[  ]に入れる正しい答えを,解答群の中から選べ。

関数 complement は,引数として渡された 8 ビット型の値 x について,x に加算すると 0⁠0⁠0⁠0⁠0⁠0⁠0⁠0 になる値を返す。8 ビット型の加算は,値を符号なし 2 進数とみなしたときの加算とし,桁あふれが発生したときのあふれた桁は無視する。演算子∧,∨,▽は,それぞれビット単位の論理積,論理和,排他的論理和を表す。

〔プログラム〕
○8ビット型: complement(8ビット型: x)
8ビット型: y
y ← [  ]
y ← y + 00000001
return y
  1. アx ∧ 0⁠1⁠1⁠1⁠1⁠1⁠1⁠1
  2. イx ∧ 1⁠1⁠1⁠1⁠1⁠1⁠1⁠1
  3. ウx ∨ 0⁠1⁠1⁠1⁠1⁠1⁠1⁠1
  4. エx ∨ 1⁠1⁠1⁠1⁠1⁠1⁠1⁠1
  5. オx ▽ 0⁠1⁠1⁠1⁠1⁠1⁠1⁠1
  6. カx ▽ 1⁠1⁠1⁠1⁠1⁠1⁠1⁠1
答えと解説を開く

正解はカです。

x と、x のビットを全部反転した値を足すと、どの桁も 0 + 1 か 1 + 0 なので 1⁠1⁠1⁠1⁠1⁠1⁠1⁠1 になります。これにさらに 1 を足すと 1⁠0⁠0⁠0⁠0⁠0⁠0⁠0⁠0 になり、あふれた 9 桁目を捨てると 0⁠0⁠0⁠0⁠0⁠0⁠0⁠0 です。つまり「x を全部反転して 1 を足した値」が答えで、プログラムの y ← y + 0⁠0⁠0⁠0⁠0⁠0⁠0⁠1 の行が、この 1 を足す所です。全部のビットを反転するには、1⁠1⁠1⁠1⁠1⁠1⁠1⁠1 との排他的論理和 (▽) を取ります。1 と排他的論理和を取ると、0 は 1 に、1 は 0 に変わるからです。正解はカです。

ほかの選択肢が違う理由

  • ア0⁠1⁠1⁠1⁠1⁠1⁠1⁠1 との論理積は、いちばん上のビットを 0 にし、ほかはそのまま残します。反転になりません。
  • イ1⁠1⁠1⁠1⁠1⁠1⁠1⁠1 との論理積は、x そのままです。y は x + 1 になり、x に足しても 0 にはなりません。
  • ウ0⁠1⁠1⁠1⁠1⁠1⁠1⁠1 との論理和は、下の 7 ビットを全部 1 にします。反転ではありません。
  • エ1⁠1⁠1⁠1⁠1⁠1⁠1⁠1 との論理和は、x が何でも 1⁠1⁠1⁠1⁠1⁠1⁠1⁠1 になります。1 を足すと常に 0⁠0⁠0⁠0⁠0⁠0⁠0⁠0 になり、x に足して 0 になる値ではありません。
  • オ0⁠1⁠1⁠1⁠1⁠1⁠1⁠1 との排他的論理和は、下の 7 ビットだけを反転し、いちばん上のビットは残します。全部の反転になりません。

仕組み

この「全部反転して 1 を足す」値を 2 の補数と呼びます。コンピュータは負の数をこの形で持つので、引き算を足し算の回路で行えます。

排他的論理和は、相手のビットが 1 の所だけを反転する演算です。反転したい所に 1 を立てた値 (マスク) と排他的論理和を取る、という使い方をよくします。