基本情報技術者試験過去問 令和8年度(2026年)科目B問2
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
関数complementは,引数として渡された8ビット型の値xについて,xに加算すると00000000になる値を返す。8ビット型の加算は,値を符号なし2進数とみなしたときの加算とし,桁あふれが発生したときのあふれた桁は無視する。演算子∧,∨,▽は,それぞれビット単位の論理積,論理和,排他的論理和を表す。
-----------
〔プログラム〕
○8ビット型: complement(8ビット型: x)
8ビット型: y
y ←
y ← y + 00000001
return y
-----------
選択肢
- ア:x ∧ 01111111
- イ:x ∧ 11111111
- ウ:x ∨ 01111111
- エ:x ∨ 11111111
- オ:x ▽ 01111111
- カ:x ▽ 11111111
- ア
- イ
- ウ
- エ
- オ
- カ
正解と解き方・学習ポイント(AI解説)
「xに加算すると00000000になる値」は、8ビットの桁あふれを無視する条件ではxの2の補数です。2の補数は、全ビット反転をしてから1を加算して求めます。プログラムでは2行目で「+ 00000001」を行っているので、空欄には全ビット反転の処理を書きます。全ビット反転は、xを11111111と排他的論理和(▽)すると実現できるため、正解は「カ」のx ▽ 11111111です。
Point
この問題は、8ビットの符号なし加算で桁あふれを無視する条件において、ある値xに足すと0になる値が2の補数になることを理解しているかを確認するものです。あわせて、排他的論理和(▽)を使うと11111111との演算で全ビット反転ができることを理解しているかを確認します。
解くために必要な知識
この問題を解くには、2の補数と、ビット演算(∧、∨、▽)の基本性質を理解している必要があります。
用語の整理
| 用語名 | 意味 |
|---|---|
| 8ビット加算(桁あふれ無視) | 計算結果が9ビット以上になっても、はみ出した上位ビットを捨てて下位8ビットだけを結果とします。 |
| 2の補数 | ある値xに加算したとき、決められたビット幅の範囲で結果が0になる値です。8ビットの場合は、(xの全ビット反転) + 1 で求めます。 |
| 1の補数 | 2進数の各ビットを反転(0を1、1を0)した値です。 |
| 排他的論理和(▽) | 2つのビットが異なるとき1、同じとき0になる演算です。1との▽はビット反転になります。 |
2の補数の作り方(8ビット)
8ビットでは、加算の桁あふれを無視するため、次の手順が原則です。
-
1の補数を作る(全ビット反転)
-
00000001を加算する
式で書くと次の形です。
- 2の補数 = (xを全ビット反転した値) + 00000001
XOR(▽)で全ビット反転する方法
全ビット反転は、11111111との排他的論理和で表せます。
- 全ビット反転した値 = x ▽ 11111111
理由は、各ビットで「a ▽ 1」はaを反転するためです。
問題の解法手順
解く手順
1. 問題が求めている値を言い換えます
「xに加算すると00000000になる値」は、8ビットで桁あふれを無視する加算では、xの2の補数です。
2. 2の補数の作り方を使います
2の補数は次の手順で求めます。
-
全ビット反転
-
その結果に1を加算
式で書くと次のとおりです。
2の補数 = (全ビット反転したx) + 1
3. プログラム中の「+1」と対応付けます
プログラムは次の流れです。
-
1行目:y ← (空欄)
-
2行目:y ← y + 00000001
2行目が「+1」を行っているので、1行目(空欄)は「全ビット反転」を行う必要があります。
4. XORで全ビット反転できることを使います
1ビットbについて、XORの性質は次のとおりです。
| 演算 | 結果 | 意味 |
|---|---|---|
| b ▽ 0 | b | 変化しません |
| b ▽ 1 | bを反転 | 0と1が入れ替わります |
よって、全てのビットに対して1をXORすれば全ビット反転になります。
x ▽ 11111111 はxの全8ビットを反転します。
5. 選択肢を選びます
空欄に入るのは、全ビット反転の処理である x ▽ 11111111 なので、正解は「カ」です。
選択肢ごとの解説
- ア:不正解
x ∧ 01111111は、最上位ビットを0にし、下位7ビットを残す演算です。全ビット反転になりません。
- イ:不正解
x ∧ 11111111は、結果がxのままになります。その後に1を加算しても、一般にxに加算して0になる値にはなりません。
- ウ:不正解
x ∨ 01111111は、下位7ビットが全て1になります。全ビット反転になりません。
- エ:不正解
x ∨ 11111111は、結果が常に11111111になります。xによらず固定値なので、xに加算して0にする値にはなりません。
- オ:不正解
x ▽ 01111111は、下位7ビットだけ反転し、最上位ビットは反転しません。全ビット反転ではないため、2の補数を作れません。
- カ:正解
x ▽ 11111111で全ビット反転になり、続く+ 00000001で2の補数になります。したがってxに加算すると00000000になります。
まとめ
「xに加算すると00000000になる値」は、8ビットの桁あふれを無視する条件ではxの2の補数です。2の補数は、全ビット反転をしてから1を加算して求めます。プログラムでは2行目で「+ 00000001」を行っているので、空欄には全ビット反転の処理を書きます。全ビット反転は、xを11111111と排他的論理和(▽)すると実現できるため、正解は「カ」のx ▽ 11111111です。
x ∧ 01111111は、最上位ビットを0にし、下位7ビットを残す演算です。全ビット反転になりません。
x ∧ 11111111は、結果がxのままになります。その後に1を加算しても、一般にxに加算して0になる値にはなりません。
x ∨ 01111111は、下位7ビットが全て1になります。全ビット反転になりません。
x ∨ 11111111は、結果が常に11111111になります。xによらず固定値なので、xに加算して0にする値にはなりません。
x ▽ 01111111は、下位7ビットだけ反転し、最上位ビットは反転しません。全ビット反転ではないため、2の補数を作れません。
x ▽ 11111111で全ビット反転になり、続く+ 00000001で2の補数になります。したがってxに加算すると00000000になります。