擬似言語のビット演算|∧ ∨ ▽ とシフト << >> の読み方【基本情報技術者試験 科目B】

基本情報技術者試験

現行FE シラバス Ver9.2 準拠擬似言語の記述形式は2022年から変更なし最終更新 2026-10-17

前回の and / or / not は、真か偽かを扱う論理演算子でした。今回は、0 と 1 を8個並べた値を、桁ごとに計算する演算子です。記号は ∧ ∨ ▽ << >> の5つ。G8-1 で見た〔演算子と優先順位〕の表にはどれも載っていません。

期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円2,600円中身を見る ›

載っていない記号が出てくる問題では、意味が問題文に書いてあります。本物はこう書かれます。

出典:基本情報技術者試験 科目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行を読む手順

  1. 問題文で、記号の意味を確かめる(∧ が論理積、など)
  2. 書き込まれた8桁(相手)の、1 の桁がどこかを見る
  3. 上の表で、その桁に何が起きるかを言葉にする(「右端だけ残す」「全部ひっくり返す」)
  4. 値が要るときだけ、縦にそろえて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 の個数を数えるプログラム)とシミュレータ・練習問題は当サイトのオリジナルです。

タイトルとURLをコピーしました