AND / OR の真理値表
AND / OR の真理値表
このレッスンで分かること
- 論理回路や条件式の世界では、
TrueとFalseの 2 つの値だけを扱いますANDの意味は「両方がTrueのときだけTrue」、ORは「少なくとも片方がTrueならTrue」です- 2 つの入力
abがそれぞれTrue/Falseを取るので、組み合わせは2 × 2 = 4通りです
AND / OR の真理値表 とは
2 つの真偽値 (0/1) を受け取り、AND と OR の結果を 2 ビットに詰めた整数で返す関数を実装します。論理演算の基礎を手で動かして確認します。
論理回路や条件式の世界では、True と False の 2 つの値だけを扱います。これを「真偽値」または boolean と呼びます。AND (論理積) と OR (論理和) は、2 つの真偽値から新しい真偽値を計算する最も基本的な演算で、回路設計から SQL の WHERE 句まで、あらゆる場所に登場します。本章ではこの 2 つの動きを真理値表として整理し、4 言語で実装します。
AND の意味は「両方が True のときだけ True」、OR は「少なくとも片方が True なら True」です。日常会話の かつ と または と重なる感覚ですが、コンピュータでは曖昧さを排除して厳密に定義されています。たとえば「雨が降っている and 傘がある」が両方とも True でないと「外出可能」と判定しない、といった条件分岐は AND の出番です。
真偽値演算はコンピュータの判断の最小単位。条件文・検索クエリ・ビット演算など、応用先が無限にあります。
真理値表で整理する
2 つの入力 a b がそれぞれ True/False を取るので、組み合わせは 2 × 2 = 4 通りです。表にまとめると次のとおりです。
| a | b | a AND b | a OR b |
|---|---|---|---|
| F | F | F | F |
| F | T | F | T |
| T | F | F | T |
| T | T | T | T |
AND は表の右下の T,T のときだけ T、OR は左上の 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) # TrueJavaScript
console.log(true && false); // false
console.log(true || false); // truePython は英単語の and or、JavaScript Java Go は記号 && || を使います。書き方は違っても結果は同じで、2 入力 → 1 出力 のシンプルな演算です。
演算をフローで見る
図のポイント (テキスト併記)
- 論理回路を学ぶときは、
ANDを&のシンボル、ORを+のシンボルで描くこともあります
論理回路を学ぶときは、AND を & のシンボル、OR を + のシンボルで描くこともあります。これはビット演算の & と | の記号にも対応しており、真偽値の AND と ビット単位の AND は本質的には同じ計算です。
「両方 True なら True」「片方でも True なら True」というシンプルなルールが、後の
ド・モルガンや含意の土台になります。
短絡評価という最適化
Python JavaScript Java Go のすべてで、AND と OR には「短絡評価 (short-circuit)」と呼ばれる仕組みが入っています。a and b で a が False なら、b は評価せずに結果が False と確定するため、b の計算は省略されます。OR も同様で、a が True なら b を見ません。
Python
def expensive():
print('called')
return True
False and expensive() # 何も出力されない (短絡)
True or expensive() # 何も出力されない (短絡)短絡評価はパフォーマンス最適化だけでなく、None ガードのような安全コードにも活躍します。user is not None and user.is_admin と書けば、user が None なら属性アクセスが行われず AttributeError を避けられます。
短絡評価は「左から評価」「結果が確定したら止まる」のセットで覚えると忘れません。
よくある間違い
1 つめは、AND と OR の優先順位の取り違えです。すべての言語で AND の方が OR より優先度が高いので、a or b and c は a or (b and c) と解釈されます。明示的な括弧を書くと安全です。2 つめは、Python で & | を AND/OR として使ってしまうケース。これは bitwise 演算であり、整数同士の演算になります。3 つめは、Python で True == 1 と True 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 = 3、a=0, b=1 なら AND=0, OR=1 で結果は 0b01 = 1 です。1 を True、0 を False とみなして真理値表どおりに計算してください。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 つができることを確認しましょう。
- AND / OR の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. AND / OR とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- AND と OR を 1 つの関数で計算する
- AND を bit1、OR を bit0 に詰めて整数で返す
- 真理値表に従った結果になる
入出力例
test-cases.txt
andOr(0, 0) → 0
andOr(0, 1) → 1
andOr(1, 0) → 1
andOr(1, 1) → 3