前回の and / or / not は、真か偽かを扱う論理演算子でした。今回は、0 と 1 を8個並べた値を、桁ごとに計算する演算子です。記号は ∧ ∨ ▽ << >> の5つ。G8-1 で見た〔演算子と優先順位〕の表にはどれも載っていません。
期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円この回の内容を動画で見る
次のページで講義の目次と無料の講義を見られます。受講ボタンとクーポンコードもそこにあります。
この回の内容を動画で見る
解くための再現性が身につく講義29本小テスト86問模試3回分IT資格の森で見る
講義「演算子(算術・論理・ビット)」(全7分19秒)は、IT資格の森(月額1,280円)の会員向けです。科目Bは、1行ずつ値を追うアニメの講義と、講義ごとの小テスト、本番と同じ形の模擬試験がそろっています。
載っていない記号が出てくる問題では、意味が問題文に書いてあります。本物はこう書かれます。
出典:基本情報技術者試験 科目B サンプル問題 問6(問題文の一部)
なお,演算子 ∧ はビット単位の論理積,演算子 ∨ はビット単位の論理和,演算子 >> は論理右シフト,演算子 << は論理左シフトを表す。例えば,value >> n は value の値を n ビットだけ右に論理シフトし,value << n は value の値を n ビットだけ左に論理シフトする。
出典:令和8年度 基本情報技術者試験 科目B 公開問題 問2(問題文の一部)
演算子∧,∨,▽は,それぞれビット単位の論理積,論理和,排他的論理和を表す。
この回では、この5つの記号をプログラムの1行として読めるようにします。計算そのものは機械的です。読みにくいのは「その1行が何をしたいのか」のほうなので、そこに時間を使います。
8ビット型 ── 0 と 1 を8個並べた値
ビット演算が出てくる問題では、変数の型が 8ビット型 になっています。
8ビット型: x ← 01101100
8ビット型 の値は、0 か 1 を8個並べたものです。1つ1つの 0 / 1 をビットといいます。01101100 は「百十万…」のような数として読むのではなく、8個のビットの並びとして読みます。先頭の 0 も省かずに書くのは、どの位置にある桁かが大事だからです(あとで「右端だけ残す」「1つ右へずらす」のように、位置で話をします)。
この回では、並びの中の場所を右端・左端と呼びます。このあとの図で枡の上にある小さい数字は、左から数えた位置です。
∧ ∨ ▽ ── 同じ位置の桁どうしで決める
3つとも、2つの8ビットの値を縦にそろえて、同じ位置の2桁だけから結果の1桁を決めます。決め方は、前回の and / or と同じ考え方を、1 を真・0 を偽として桁ごとに当てたものです。
1桁の決め方
∧(論理積)両方とも 1 のときだけ 1
∨(論理和)どちらか一方でも 1 なら 1
▽(排他的論理和)2つが違うときだけ 1
これを8桁ぶん、1桁ずつくり返します。
同じ位置の桁どうしを見て、1桁ずつ決める
x = 01101100、y = 00111010 緑=結果が 1 になった桁(枡の上の小さい数字は、左から数えた桁の位置)
材料の2つ
x
10
21
31
40
51
61
70
80
y
10
20
31
41
51
60
71
80
縦にそろった2桁だけを見ます。となりの桁は関係ありません(足し算のような繰り上がりも無い)
x ∧ y 両方とも 1 の桁だけ 1
10
20
31
40
51
60
70
80
x ∨ y どちらか一方でも 1 なら 1
10
21
31
41
51
61
71
80
x ▽ y 2つが違う桁だけ 1
10
21
30
41
50
61
71
80
∧ と ∨ は、前回の and と or を1桁ずつ8回やっているだけです。新しいのは ▽ で、同じなら 0、違えば 1。両方 1 の桁(3桁目と5桁目)は、∨ では 1 なのに ▽ では 0 になります。
相手の8桁が、式の役割を決める
本番のプログラムでは、2つの材料のうち片方が変数、もう片方が書き込まれた8桁(00000001 や 11111111)になっていることがよくあります。この書き込まれた8桁を見ると、その1行が何をしたいのかが分かります。
前の図の x を、相手だけ変えて3通り計算してみます。
同じ x でも、組ませる相手で起きることが変わる
緑=もとの x から値が変わった桁
もとの x
10
21
31
40
51
61
70
80
x ∧ 00001111 相手が 0 の桁は 0 に消え、1 の桁は x のまま
10
20
30
40
51
61
70
80
左の4桁が消えて、右の4桁だけが残りました
x ∨ 00001111 相手が 1 の桁は 1 に立ち、0 の桁は x のまま
10
21
31
40
51
61
71
81
右の4桁が全部 1 になりました。左の4桁は x のまま
x ▽ 11111111 相手が 1 の桁は、x の逆になる
11
20
30
41
50
60
71
81
相手が8桁とも 1 なので、8桁ぜんぶひっくり返りました
3つを、相手の桁が 0 のところ・1 のところに分けて言い直すと、こうなります。
| 式 | 相手が 0 の桁 | 相手が 1 の桁 |
|---|---|---|
x ∧ 相手 |
0 に消える | x のまま |
x ∨ 相手 |
x のまま | 1 に立つ |
x ▽ 相手 |
x のまま | x の逆になる |
相手の8桁のどこが 1 でどこが 0 かで、その1行がどの桁に手を入れるかが決まります。このように桁を選ぶために用意した相手の8桁を、マスクと呼ぶことがあります。
ビット演算の1行を読む手順
- 問題文で、記号の意味を確かめる(
∧が論理積、など) - 書き込まれた8桁(相手)の、1 の桁がどこかを見る
- 上の表で、その桁に何が起きるかを言葉にする(「右端だけ残す」「全部ひっくり返す」)
- 値が要るときだけ、縦にそろえて8桁を書き出す
次の式の値はどれですか。
10110110 ∧ 00111100
8ビット型の変数 x の右から3つ目の桁だけを 1 にし、ほかの7桁は x のままにしたい。x がどんな値でもそうなる式はどれですか。
<< >> ── 桁をずらす(シフト)
x >> 1 は、8桁をそろって1つ右へずらします。x >> 2 なら2つです。問題文の「論理右シフト」がこれです。
x >> 1 ── 8桁が、そろって1つ右へずれる
x = 00101101
シフトする前の x
10
20
31
40
51
61
70
81
右端の 1 には、ずれた先の桁がありません
1つ右へ
10
20
30
41
50
61
71
80
左端の空いた桁には 0 が入り(緑)、右端からはみ出した 1 は消えます
シフトすると、端で2つのことが起きます。反対側の端には 0 が入り、ずらした向きの端からはみ出した桁は消えます。はみ出した桁が反対側へ回ってくることはありません。
<< は向きが逆なだけです。00101101 << 1 は 01011010。左端の 0 がはみ出して消え、右端に 0 が入ります。
シフトで起きること
8桁がそろって n 桁ぶんずれる
空いた端には0 が入る
はみ出した桁は消える(反対側へは回らない)
次の式の値はどれですか。
10010011 >> 2
取り出して、シフトする ── 1桁ずつ読む繰返し
ここまでの2つを組み合わせると、8桁を1桁ずつ順に調べることができます。
x ∧ 00000001は、相手が右端だけ 1 なので、x の右端だけを残します。結果が00000001なら右端は 1、00000000なら 0 ですx ← x >> 1は、いま見た右端を捨てて、1つ左の桁を右端へずらします
この2行を8回くり返すと、右端に8桁が1つずつ順番にやってきます。次のプログラムは、それを使って 8桁の中の 1 の個数を数えます。
1 の個数を数える ── 右端を見て、シフトする
当サイトオリジナル
ループ開始前
いま計算していること
変数の状態
戻り値
トレース表(進めると1行ずつ積み上がります)
上の装置のプログラムで、for の終了値だけを 8 から 7 に書き換えました。count1(10010000) の戻り値はどれですか。
○整数型: count1(8ビット型: x)
整数型: cnt ← 0
整数型: i
for (i を 1 から 7 まで 1 ずつ増やす)
if ((x ∧ 00000001) = 00000001)
cnt ← cnt + 1
endif
x ← x >> 1
endfor
return cnt
まとめ
| 書き方 | この1行がすること | 例(x = 01101100) |
|---|---|---|
x ∧ 00000001 |
右端だけを残し、ほかは 0 にする | 00000000 |
x ∧ 00001111 |
右の4桁だけを残す | 00001100 |
x ∨ 00001111 |
右の4桁を 1 にする。左の4桁はそのまま | 01101111 |
x ▽ 11111111 |
8桁ぜんぶひっくり返す | 10010011 |
x >> 1 |
1つ右へずらす。左端に 0、右端は消える | 00110110 |
x << 1 |
1つ左へずらす。右端に 0、左端は消える | 11011000 |
次に読む
この記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では、引用した箇所の文言を改変していません(省略や補いがある場合は、その場に明記しています)。
本文の例(01101100 などの8桁、1 の個数を数えるプログラム)とシミュレータ・練習問題は当サイトのオリジナルです。

