AND / OR の真理値表

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

AND / OR の真理値表

このレッスンで分かること

  • 論理回路や条件式の世界では、TrueFalse の 2 つの値だけを扱います
  • AND の意味は「両方が True のときだけ True」、OR は「少なくとも片方が True なら True」です
  • 2 つの入力 a b がそれぞれ True/False を取るので、組み合わせは 2 × 2 = 4 通りです

AND / OR の真理値表 とは

2 つの真偽値 (0/1) を受け取り、AND と OR の結果を 2 ビットに詰めた整数で返す関数を実装します。論理演算の基礎を手で動かして確認します。

論理回路や条件式の世界では、TrueFalse の 2 つの値だけを扱います。これを「真偽値」または boolean と呼びます。AND (論理積) と OR (論理和) は、2 つの真偽値から新しい真偽値を計算する最も基本的な演算で、回路設計から SQLWHERE 句まで、あらゆる場所に登場します。本章ではこの 2 つの動きを真理値表として整理し、4 言語で実装します。

AND の意味は「両方が True のときだけ True」、OR は「少なくとも片方が True なら True」です。日常会話の かつまたは と重なる感覚ですが、コンピュータでは曖昧さを排除して厳密に定義されています。たとえば「雨が降っている and 傘がある」が両方とも True でないと「外出可能」と判定しない、といった条件分岐は AND の出番です。

真偽値演算はコンピュータの判断の最小単位。条件文・検索クエリ・ビット演算など、応用先が無限にあります。

真理値表で整理する

2 つの入力 a b がそれぞれ True/False を取るので、組み合わせは 2 × 2 = 4 通りです。表にまとめると次のとおりです。

aba AND ba OR b
FFFF
FTFT
TFFT
TTTT

AND は表の右下の T,T のときだけ TOR は左上の F,F のときだけ F という非対称さがあります。この表を見れば、AND は「制約が強い」、OR は「制約が緩い」演算と直感的にわかります。たとえば検索条件で タグ A AND タグ B と書けば結果は減り、タグ A OR タグ B と書けば増えます。

Python

print(True and False) # False print(True or False) # True print(False and False) # False print(False or True) # True

JavaScript

console.log(true && false); // false console.log(true || false); // true

Python は英単語の and orJavaScript Java Go は記号 && || を使います。書き方は違っても結果は同じで、2 入力 → 1 出力 のシンプルな演算です。

演算をフローで見る

diagram (will load when visible)

図のポイント (テキスト併記)

  • 論理回路を学ぶときは、AND& のシンボル、OR+ のシンボルで描くこともあります

論理回路を学ぶときは、AND& のシンボル、OR+ のシンボルで描くこともあります。これはビット演算の &| の記号にも対応しており、真偽値の ANDビット単位の AND は本質的には同じ計算です。

「両方 True なら True」「片方でも True なら True」というシンプルなルールが、後の ド・モルガン含意 の土台になります。

短絡評価という最適化

Python JavaScript Java Go のすべてで、ANDOR には「短絡評価 (short-circuit)」と呼ばれる仕組みが入っています。a and baFalse なら、b は評価せずに結果が False と確定するため、b の計算は省略されます。OR も同様で、aTrue なら b を見ません。

Python

def expensive(): print('called') return True False and expensive() # 何も出力されない (短絡) True or expensive() # 何も出力されない (短絡)

短絡評価はパフォーマンス最適化だけでなく、None ガードのような安全コードにも活躍します。user is not None and user.is_admin と書けば、userNone なら属性アクセスが行われず AttributeError を避けられます。

短絡評価は「左から評価」「結果が確定したら止まる」のセットで覚えると忘れません。

よくある間違い

1 つめは、ANDOR の優先順位の取り違えです。すべての言語で AND の方が OR より優先度が高いので、a or b and ca or (b and c) と解釈されます。明示的な括弧を書くと安全です。2 つめは、Python& |AND/OR として使ってしまうケース。これは bitwise 演算であり、整数同士の演算になります。3 つめは、PythonTrue == 1True is 1 の挙動を混同するケース。論理演算では == を使い、is (同一性) は型の判定には使わないようにしましょう。

Python

print(2 & 3) # 2 (bitwise AND) print(2 and 3) # 3 (truthy なので右側を返す)

やってみよう

2 つの真偽値を 0/1 で表した整数 a b を受け取り、(AND << 1) | OR という 2 ビット整数を返す関数 andOr(a, b) を実装します。AND の結果を上位ビット (bit1)、OR の結果を下位ビット (bit0) に詰める形です。たとえば a=1, b=1 なら AND=1, OR=1 で結果は 0b11 = 3a=0, b=1 なら AND=0, OR=1 で結果は 0b01 = 1 です。1True0False とみなして真理値表どおりに計算してください。4 通り (0,0 0,1 1,0 1,1) のすべてで真理値表どおりの結果 (0 1 1 3) が返れば合格です。

よくある質問

Q. ビット演算は実務でいつ使いますか?

A. フラグ管理(permission の rwx)、画像処理(マスク)、ハッシュ計算の高速化などで使います。複数の真偽値を 1 つの整数にまとめると、メモリ削減と演算高速化の両方が得られます。例えば 8 個の権限を 1 byte で表せます。

Q. AND / OR / XOR の代表的な使い道は?

A. AND は「特定ビットの確認・抽出」(flags & PERM_READ)、OR は「ビットの立て上げ」(flags |= PERM_WRITE)、XOR は「ビット反転や暗号化」で使います。XOR は 2 回かけると元に戻る性質から、簡易暗号や両端ポインタの入れ替えなどに応用できます。

Q. シフト演算で割り算しても良いですか?

A. 正の整数の 2 のべき乗での除算なら x >> n と x / (1<<n) は同じ結果になります。ただし負の数では言語ごとに挙動が違う(算術シフトと論理シフトの区別)ため、可読性と安全性のために通常の演算子を使い、性能ボトルネックでのみシフトを検討してください。

次のレッスン

次は NOT / XOR の真理値表 に進みましょう。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. AND / OR の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. AND / OR とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. AND と OR を 1 つの関数で計算する
  2. AND を bit1、OR を bit0 に詰めて整数で返す
  3. 真理値表に従った結果になる

入出力例

test-cases.txt

andOr(0, 0)0 andOr(0, 1)1 andOr(1, 0)1 andOr(1, 1)3

ヒント

main.py
main.py
学習モード

メモ

AND / OR の真理値表

⌘S で保存