コンピューターサイエンス入門:理論編
NOT / XOR の真理値表
この回でやること
NOTによる否定とXORによる食い違いの判定を読み解き、許可と拒否の条件を確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
「食い違っていたら」を短く読む
2つの設定が食い違っていたら警告を出したい。ANDとORで表すと、「片方が真でもう片方が偽、または、片方が偽でもう片方が真」と、2つの場合を並べることになります。
この食い違いを表すのがXORです。あわせて、真と偽をひっくり返すNOTも見ます。2つの値が同じか違うかと、1つの値を否定することは別の操作です。
ORの表を1行変えると、XORになる
ORは、少なくとも片方が真なら真でした。XORは「真がちょうど1つ」の場合だけ真になります。
| a | b | a OR b | a XOR b |
|---|---|---|---|
| 偽 | 偽 | 偽 | 偽 |
| 偽 | 真 | 真 | 真 |
| 真 | 偽 | 真 | 真 |
| 真 | 真 | 真 | 偽 |
変わるのは最後の1行です。XORでは両方が真でも偽になります。ORと取り違えると、「どちらか一方だけ」のつもりで両方を許してしまいます。
現場の話 ファイルへの「上書き」と「追記」のどちらか一方だけを選ぶ設定では、両方選択も未選択も拒否したい場合があります。2つの選択状態を真偽値にすれば、XORで許可条件を表せます。
NOTは、1つの真偽値を反転する
NOTは真を偽へ、偽を真へ変えます。許可条件を否定すれば、拒否条件になります。先ほどの設定なら、XORが偽のときに拒否するので、拒否条件はNOTを付けたXORです。
Python
print(True ^ False) # True
print(True ^ True) # False
print(not (True ^ True)) # Trueこの例の ^ は、Pythonの真偽値どうしのXORです。括弧を先に読み、次に not で結果を反転します。
整数では 2 ^ 3 は1です。2の2進数 10 と3の 11 を桁ごとに比べると 01 になります。2 ** 3 の8とは違います。JavaScriptで真偽値どうしの食い違いを見るなら !== を使えます。真偽値を ^ に渡すと数として扱われ、結果は0か1です。
否定は、比較の境界も含めて読む
数の x について、not (x > 0) は x <= 0 と同じです。0は「0より大きい」に含まれないので、その否定には含まれます。x < 0 にしてしまうと、0が抜けます。
例題で確かめる
設定が4件あります。上書きと追記の状態が順に「真・偽」「真・真」「偽・偽」「偽・真」です。XORは順に真、偽、偽、真なので、許可は1件目と4件目の2件です。NOTで反転した拒否条件は偽、真、真、偽となり、残る2件を拒否します。