過去問解きまくり研究所 ホーム

令和8年度 科目B 問2

離散数学

補数に関する問題

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

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

〔プログラム〕

○8ビット型: complement(8ビット型: x)
  8ビット型: y
  y ← [ ]
  y ← y + 00000001
  return y
答えと解説を見る

✓ これが正解カx ▽ 11111111

解説

全ビットを反転してから 1 を足せば、x と足して 0 になります。

x に足すと 00000000 になる値は、8 ビットの範囲での x の 2 の補数(負の数を表すときに使う、全ビットを反転して 1 を足した値)です。桁あふれを無視する加算なので、x + y がちょうど 100000000(9 ビット目だけが 1)になれば、下位 8 ビットは 00000000 になります。プログラムは空欄の後で 00000001 を足しているので、空欄では x の全ビットを反転した値を作ればよいことになります。

ビットの反転は、各ビットと 1 との排他的論理和で作れます。排他的論理和は二つのビットが異なるときだけ 1 になる演算なので、相手が 1 なら 0 は 1 に、1 は 0 に変わります。x = 00000101 で追うと、x ▽ 11111111 は 11111010 で、これに 00000001 を足して y = 11111011 です。x + y = 00000101 + 11111011 = 100000000 となり、あふれた 9 ビット目を捨てると 00000000 です。

x と、その全ビットを反転した値を足すと、どの桁も 0 と 1 の組になるので 11111111 になります。これに 1 を足すと必ず桁あふれして 00000000 になるため、どんな x でも成り立ちます。空欄には x ▽ 11111111 が入ります。

全ビットの反転は 11111111 との排他的論理和、特定のビットを 0 にするのは論理積、1 にするのは論理和、という使い分けを押さえておくと、ビット演算の空欄を見分けられます。

ほかの選択肢はなぜ違うのか

出典:令和8年度 基本情報技術者試験 科目B 問2

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)