AND / OR の真理値表
「かつ」と「または」を取り違えると、結果が逆になる
検索でタグを 2 つ指定します。かつ にすると結果がぐっと減り、または にすると増えます。同じ 2 つの条件を並べただけなのに、返ってくる件数は正反対に動きます。
この 2 つが AND と OR です。日常語の感覚でもだいたい合っていますが、境目の 1 通りを取り違えると、通してはいけないものを通します。曖昧さを残さないために、起こりうる組み合わせを全部書き出して決めます。
4 通りしかないので、表にできる
入力が 2 つで、それぞれ真か偽なので、組み合わせは 4 通りです。この全数の表を真理値表と呼びます。
| a | b | a かつ b | a または b |
|---|---|---|---|
| 偽 | 偽 | 偽 | 偽 |
| 偽 | 真 | 偽 | 真 |
| 真 | 偽 | 偽 | 真 |
| 真 | 真 | 真 | 真 |
AND の列は 4 行のうち 1 行だけが真、OR の列は 1 行だけが偽です。AND は厳しく、OR は緩い、という直感がそのまま表の形に出ています。
Python
print(True and False) # False
print(False or True) # TruePython は and と or、JavaScript や Java や Go は && と || と書きます。字面が違うだけで、表は同じです。
左で決まったら、右は見に行かない
and は、左が偽だった時点で答えが偽に確定します。or は、左が真なら真に確定します。どの言語もこのとき右側を評価しません。これを短絡評価と呼びます。
Python
def heavy():
print('呼ばれた')
return True
False and heavy() # 何も出ない
True or heavy() # 何も出ない速さのためだけの仕組みではありません。user is not None and user.is_admin と並べておけば、user が空のときに属性を触りに行かずに済みます。順番に意味があるので、条件の並べ替えは気軽にやらないでください。
and と & は別物
Python の & は桁ごとの計算でした。2 & 3 は 2 になりますが、2 and 3 は 3 を返します。後者は真偽値ですらありません。
真偽の判定には and と or、フラグの組み立てには & と | と、使う場所で分けてください。どちらもエラーにならず、それらしい数が返ってくるので、取り違えたまま動いてしまいます。
要件
- AND と OR を 1 つの関数で計算する
- AND を bit1、OR を bit0 に詰めて整数で返す
- 真理値表に従った結果になる
入出力例
andOr(0, 0) → 0
andOr(0, 1) → 1
andOr(1, 0) → 1
andOr(1, 1) → 3