令和8年度の科目B、その2問目です。∧ ∨ ▽ という見慣れない記号が出てきますが、空欄は1か所しかありません。ここでは解答群を1つずつ計算しません。空欄に入るべき値を先に数字で出してから、それを作る式をまっすぐ探します ── 決めるのは「どの記号を使うか」と「何と組ませるか」の2つだけです。
出題
まず原文のまま読んでみてください。記号の読み方は、次の節にまとめてあります。読めなくてもここでは問題ありません。
出典:令和8年度 基本情報技術者試験 科目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
答えだけ先に見る
自分で解けるようになりたい人は、閉じたまま進んでください。ここから先は、答えを知らない状態で1つずつ決めていく順に書いてあります。
正解は カ(x ▽ 11111111)。決め手は2つだけです ── ▽ は桁をひっくり返すことと、11111111 と組めば8桁すべてに効くこと。
まず、通しで見る
5分ほどの動画です(音声つき)。この記事と同じ流れで、空欄を決めていきます。読むより先に流れをつかみたい人は、こちらから。
ビット演算がはじめてでも追えるように、足し算の繰り上がりも1桁ずつ描いています。最後は解答群のア〜カを並べ、どれを選んでいたら何が返っていたのかを見ます。
入るべき値を先に出して、それを作る式を見つける(5分53秒・音声つき)
再生できないときは、この下の説明とシミュレータで同じ内容を追えます。
ここから、同じ内容を1つずつ確かめていきます。
この問題に出てくる記号
いま読めればいいのは、5つだけです。細かいところは、使う場面で足していきます。
| 書き方 | 読み方 |
|---|---|
8ビット型 |
0 と 1 が8桁ならんだ値。00000101 のように書きます。この記事では1桁を「桁」、左端を1桁目と呼びます |
| 符号なし2進数 | マイナスの値を考えないという断り。この問題では8桁を 0 と 1 のならびとしてしか扱わないので、それがいくつを表すかは考えなくて大丈夫です |
← |
左に書き込む。書かれた側の元の値は消えます |
∧ 論理積 |
両方が 1 のときだけ 1。相手が 1 の桁は x のまま、相手が 0 の桁は 0 になって消えます |
∨ 論理和 |
少なくとも一方が 1 なら 1。相手が 1 の桁に 1 が立ち、相手が 0 の桁は x のまま |
▽ 排他的論理和 |
2つがちがうときだけ 1。相手が 1 の桁が ひっくり返り、相手が 0 の桁は x のまま |
| (3つに共通) | いずれも桁ごとに効きます。この問題文が定義している記号で、擬似言語の共通の書き方ではありません。3つのちがいが、そのまま答えを決めます。 |
| 桁あふれは無視 | 足して9桁になったら、はみ出した1桁は捨てる。8桁に収まったぶんだけが残ります |
return y |
y を返して終わり。呼んだ側にこの値が渡ります |
返す値を、x = 00000101 で自分の手で作る
いきなり記号の意味から入ると、何を作らされているのか分からないまま計算することになります。先に、この関数(この記事では「部品」とも呼びます)が何を返すのかを見ておきます。
問題文が言っているのは1つだけです。「x に加算すると 00000000 になる値を返す」。ここで注意したいのは、問題文は返す値そのものを書いていないことです。書いてあるのはその値が満たすべき条件だけ。だから、x を1つ決めて、返す値を自分で作ってみます。この記事では x = 00000101 を例に使います。
これ以降の図では、緑の枡がその手順で新しく決まった値、琥珀の枡がとくに見てほしい桁、破線の「?」がまだ決まっていない桁、赤い破線の枡が捨てられる桁です。なおうすい「0」はこうなってほしい形(=そうなるように足す値を決める目標)で、まだ導いていない桁です。
この部品が返すのは、どんな値か
x = 00000101 を渡したとき
渡す値 x
10
20
30
40
50
61
70
81
枡の上の小さい数字は、左から数えた桁の位置です
返ってくる値
1?
2?
3?
4?
5?
6?
7?
8?
x に足すと 00000000 になる値。問題文はそう言っているだけで、値そのものは書いてありません。この8桁を、これから1つずつ決めます
ふつうの足し算と向きが逆です。答え(00000000)のほうが先に分かっていて、足す相手を探します。使う道具は2進数の足し算だけです。
3桁で1回やってみます。足して 000 になる形です。
0 1 1 + 1 0 1 --------- 1 0 0 0 ← あふれの 1 を捨てて 000
右端 1 + 1 = 10。その桁は 0 で、1つ左へ 1 を送ります(繰り上がり)
まん中 1 + 0 に、右から来た 1 が乗って 3つの足し算。1 + 0 + 1 = 10 でまた 0、左へ 1
左端 0 + 1 + 1 = 10。桁は 0 で、最後の 1 は3桁の外へ出ます(あふれ)
はみ出した桁を捨ててよいのは、問題文が「桁あふれが発生したときのあふれた桁は無視する」と決めているからです。繰り上がりは右から左へしか進まないので、右端から見ていけば、その桁で足すものは毎回そろっています。
8桁でも同じです。右端から、結果のその桁が 0 になるほうを選んでいきます。
返ってくる値を、右端の桁から1つずつ決める
足した結果が8桁ぜんぶ 0 になるように、足す値を右から決めていく(x = 00000101。この足す値が、そのまま返ってくる値になります)。緑=この段で決まった/琥珀=ここを見てほしい桁/破線の ?=まだ決まっていない/うすい 0=こうなってほしい形/赤=8桁からあふれて捨てる。「次へ」で1桁ずつ進みます。
① 8桁目(右端) ── 足す値は 1
繰り上がり
あふれ
1
2
3
4
5
6
71
8
x
10
20
30
40
50
61
70
81
足す値
1?
2?
3?
4?
5?
6?
7?
81
足した結果
10
20
30
40
50
60
70
80
x の右端は 1。ここに 0 を足しても 1 + 0 = 1 で、1 のまま残ってしまいます。1 を足すと 1 + 1 = 10 ── この桁は 0 になり、1 が7桁目へ繰り上がります
② 7桁目 ── 足す値は 1
繰り上がり
あふれ
1
2
3
4
5
61
71
8
x
10
20
30
40
50
61
70
81
足す値
1?
2?
3?
4?
5?
6?
71
81
足した結果
10
20
30
40
50
60
70
80
右から2番目の桁です。x の桁は 0。そこへ右から来た繰り上がりの 1 が乗っていて、いま 1。0 を足すと 0 + 0 + 1 = 1 で 0 になりません。1 を足せば 0 + 1 + 1 = 10 で 0。また繰り上がります
③ 6桁目 ── 足す値は 0
繰り上がり
あふれ
1
2
3
4
51
61
71
8
x
10
20
30
40
50
61
70
81
足す値
1?
2?
3?
4?
5?
60
71
81
足した結果
10
20
30
40
50
60
70
80
ここだけ答えが変わります。x の桁が 1、繰り上がりも 1 ── 1 + 1 = 10 で、何も足さなくてもこの桁は 0。1 を足すと 11 になって、この桁が 1 になってしまいます
④ 5桁目から1桁目まで ── どれも 1
繰り上がり
あふれ1
11
21
31
41
51
61
71
8
x
10
20
30
40
50
61
70
81
足す値
11
21
31
41
51
60
71
81
足した結果
あふれ1
10
20
30
40
50
60
70
80
この5桁は ②(7桁目)とまったく同じ形(x が 0・繰り上がりが 1)なので、足す値も同じでどれも 1。これが左端まで続き、最後の繰り上がりが8桁の外へ出ます
⑤ あふれた1桁を捨てる
足す値
11
21
31
41
51
60
71
81
足した結果
あふれ1
10
20
30
40
50
60
70
80
捨てたあと
10
20
30
40
50
60
70
80
はみ出した1桁を捨てると、残る8桁はぜんぶ 0。④で決まった 11111011 が、返ってくる値です
x = 00000101 のとき、返ってくるのは 11111011
返ってくる値が決まりました
x = 00000101 のとき、この部品が返すのは 11111011。どの桁も、結果を 0 にできる足す値は 1 つしかないので、返す値は 1 つに決まります。
プログラムを読む ── 4行目が 1 を足すので、考えるのは3行目だけ
返る値は出ました。では、その値をプログラムのどこが作っているのか。5行を1行ずつ見ます ── 空欄は3行目の1か所だけです。
1○8ビット型: complement(8ビット型: x)
8桁の値を1つ受け取り、8桁の値を1つ返す部品
2 8ビット型: y
返す値を作るための箱。8桁ぶんある
3 y ←
① 空欄 ── x をどう変えるかが、ここで決まる
4 y ← y + 00000001
② 1を足す ── 3行目で作った y に、そのまま 1 が乗る
5 return y
③ できた y を返して終わり
※ 左の行番号と右の注釈は当サイトで付けたものです(原文にはありません)。プログラム自体は原文のまま引用しています。以降、本文で「3行目」と言うときはこの番号を指します。
1行目の ○ は「ここから1つの部品が始まる」という印で、括弧の中の 8ビット型: x は受け取る値(引数)の型と名前です。complement(00000101) のように呼ばれると、x に 00000101 が入った状態で1行目から始まります。
3行目のあとの y は 11111010 ── x と並べると8桁ぜんぶ逆
返す値は 11111011 と分かりました。返るのは4行目を終えたあとの yで、4行目は 1 を足すだけです。だから3行目のあとの y は、11111011 から 1 を戻した値 ── 右端の 1 を 0 にして 11111010 です。
3行目のあとの y ── x と並べると、8桁ぜんぶ逆
緑=プログラムが y に書く値 / 琥珀=ここを見てほしい ── 確かめのために足してみた結果
x
10
20
30
40
50
61
70
81
3行目のあとの y ── 返す値 11111011 から 1 を戻した値
11
21
31
41
51
60
71
80
どの桁も x と逆です。x が 0 の桁は 1、x が 1 の桁は 0。
この2つを足すと、どの桁も 0 と 1 が1つずつ
11
21
31
41
51
61
71
81
繰り上がりが1回も起きません。ここへ4行目の 1 が乗ると 9桁になり、あふれを捨てて 00000000 ── x が何であってもそうなります。
3行目でやること
x の8桁を、ぜんぶひっくり返す。これだけです。x が別の値でも同じで、ひっくり返した値は必ず x と足して 11111111 ── どの桁も 0 と 1 が1つずつになるからです。
ひっくり返せる記号は ▽、8桁に効かせる相手は 11111111
記号 ── 両方向へ入れかえられるのは ▽ だけ
やりたいのは、x の 0 を 1 に、1 を 0 に両方向へ変えることでした。記号の表のとおり、∧ にできるのは桁を 0 にすることだけ、∨ にできるのは桁を 1 にすることだけです。両方向へ入れかえられるのは ▽ だけです。
3つを並べて確かめます。どの記号がどの働きを持つかは、相手が何であっても変わりません(相手で変わるのは「その働きがどの桁に効くか」だけ)。だから相手より先に記号が決まります。
11111111 と組ませると、3つの記号は何をするか
x = 00000101 のとき ── 相手を8桁すべて 1 にして、3つの記号を並べています。緑=その記号で出た結果
上が x、下が組む相手の 11111111
10
20
30
40
50
61
70
81
11
21
31
41
51
61
71
81
∧ 両方が 1 のときだけ 1
10
20
30
40
50
61
70
81
x のまま。1桁も変わらない
∨ 少なくとも一方が 1 なら 1
11
21
31
41
51
61
71
81
x が何であっても8桁ぜんぶ 1。x の中身が消えてしまう
▽ 2つがちがうときだけ 1
11
21
31
41
51
60
71
80
8桁ぜんぶひっくり返った ── 探していたのはこれ
記号が決まりました
▽(排他的論理和)。∧ は1桁も動かず、∨ は x が何であっても全部 1 になってしまいます。8桁をひっくり返せたのは ▽ だけでした。
相手 ── 8桁すべてに効かせたいので 11111111
▽ がひっくり返すのは相手の桁が 1 のところだけで、相手が 0 の桁は x のまま残ります。ひっくり返したいのは8桁すべてなので、相手も8桁すべてを 1 にした値にします。1桁でも 0 があると、そこだけ取り残されます。
式ができました
y ← x ▽ 11111111。同じ形を解答群から探すと、カ です。
ア x ∧ 01111111イ x ∧ 11111111ウ x ∨ 01111111
エ x ∨ 11111111オ x ▽ 01111111カ x ▽ 11111111
ほかの5つは、どれもひっくり返せません ── ∧(ア・イ)は桁を消すだけ、∨(ウ・エ)は1 を立てるだけ。オは記号こそ ▽ ですが、相手の1桁目が 0 なのでそこだけ取り残されます(x = 00000101 なら 01111010)。
1桁ずつ追う
ここまでの結論を、実際に動かして確かめます。▲ が出ているのがいま見ている桁です。見るのは、x の桁と 11111111 の桁を組み合わせて、y の桁がどう決まるかの1点だけ。まだ決まっていない y の桁は空にしてあります。
ここは左端から進みます。足し算とちがって記号での組み合わせは桁どうしが独立(繰り上がりが無い)なので、どの向きから見ても結果は同じです。
1桁ずつ追う 正解の カ(x ▽ 11111111)
出典:令和8年度 科目B 公開問題 問2(空欄に カ を入れたもの)
ループ開始前
8桁のならび
いま計算していること
変数の状態
return で返す値
トレース表(進めると1行ずつ積み上がります)
正解は カ
y ← x ▽ 11111111。先に数字で出した「3行目のあとの y」が、そのまま動いて確かめられました。
同じ考え方で解く練習問題
身についたかどうかは、やりたいことが変わった問題で確かめるのがいちばんです。+ 00000001 の行はありませんが、記号と相手を決める手順は同じです。
この練習問題は当サイトのオリジナルです(IPAの出題ではありません)。
x の右端の3桁だけを 1 にして、ほかの桁はそのままにしたいとします(たとえば 10101010 なら 10101111 にする)。空欄に入れる正しい答えはどれですか。
(∧ は両方が 1 のときだけ 1、∨ は少なくとも一方が 1 なら 1(両方 1 でも 1)、▽ は2つがちがうときだけ 1。いずれも桁ごとに当てる記号です。)
○8ビット型: setLow3(8ビット型: x) 8ビット型: y y ← return y
∧ ∨ ▽ の問題を見分ける
ここまで使った判断は、「やりたいこと」から記号が決まり、「効かせたい桁」から相手が決まるという2段です。やりたいことから逆に引くと、こうなります。
| やりたいこと | 使う記号 | 相手に置く値 |
|---|---|---|
| ある桁を 0 にしたい(消す) | ∧ |
残したい桁を 1 にした値( 0 を置いた桁が消える。ここだけ他の2つと逆) |
| ある桁を 1 にしたい(立てる) | ∨ |
立てたい桁を 1 にした値 |
| ある桁を ひっくり返したい | ▽ |
返したい桁を 1 にした値 |
ビット演算の空欄を決める手順
- 先に記号を決める。やりたいことが言えれば、上の表の2列目で記号が1つに決まります。
- 次に相手を決める。相手は「効かせたい桁を
1にした値」。∧のときだけ逆で「残したい桁を1」です(上の表の右の列)。
この順なら、値を1つも計算しないうちに式が1本に決まります。あとは同じ形を解答群から探すだけなので、選択肢がいくつあっても決めるのは記号と相手の2つで済みます。6つを1つずつ計算するのは、決め終わったあとの答え合わせで足ります。
次に読む
この問題でどこに手間取ったかで、行き先が変わります。
return で何が呼び出し元へ渡るのかが曖昧だった人へ問1令和8年度 科目B 問1 ── 同じ年度の1問目。配列と繰返しの問題です一覧科目B 全44問の解説 ── 同じ形の問題を続けて解きたい人へこの記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
「下3桁だけを1にする」練習問題は当サイトのオリジナルです。

