白猫のメモ帳

JavaとかC#とかJavaScriptとかHTMLとか機械学習とか。

排他的論理和は^じゃなくて!=でよくない?

こんにちは。
ほんとに、ほんとーに毎日毎日暑いですね。
もうとろけてしまう。

で、なんだか偉い人に怒られてしまいそうなタイトルですが、
論理演算子を条件演算にしか使わないような我々には、
滅多に現れない排他的論理和をググりながら書くよりはいいんじゃないのってお話。

論理演算の種類

論理演算の種類はたくさんあるのですが、実際プログラミングで利用するものはある程度限られています。

論理積(AND)

条件Pと条件Qがあるとき、PとQの両方が真であることを論理積と呼びます。
(true、falseって書いたら読みづらかったので、○×にしますね。)

条件P 条件Q AND
× ×
× ×
× × ×

一般的にプログラミング言語では記号「&」を利用して、

p & q

のように記述します。

また、条件演算に利用する場合には、左から評価するとすれば、
条件Pがfalseの場合には条件Qの値にかかわらずfalseとなるため、短絡評価(ショートサーキット)することができます。
これは一般的にプログラミング言語では記号「&」を二つ重ねて、

p && q // pがfalseの場合、qの評価はしない

のように記述します。
今回の記事では深くはつっこみませんが、パフォーマンスの観点や副作用の観点から、一般的には短絡評価を使うことが多いです。

否定論理積(NAND)

条件Pと条件Qがあるとき、PとQの少なくとも片方が偽であることを否定論理積と呼びます。

条件P 条件Q NAND
×
×
×
× ×

論理積(AND)の反転であることから、一般的にプログラミング言語では否定「!」を利用して、

!(p && q)

のように記述します。

論理和(OR)

条件Pと条件Qがあるとき、PとQの少なくとも片方が真であることを論理和と呼びます。

条件P 条件Q AND
×
×
× × ×

一般的にプログラミング言語では記号「|」を利用して、

p | q

のように記述します。

また、論理積と同様に、条件Pがtrueの場合には条件Qの値にかかわらずtrueとなるため、短絡評価することができます。

p || q // pがtrueの場合、qの評価はしない

こういうことですね。

否定論理和(NOR)

条件Pと条件Qがあるとき、PとQの両方が偽であることを否定論理和と呼びます。

条件P 条件Q AND
×
× ×
× ×
× ×

論理和(OR)の反転であることから、一般的にプログラミング言語では否定「!」を利用して、

!(p || q)

のように記述します。

排他的論理和(XOR)

条件Pと条件Qがあるとき、PとQどちらか片方が真で、もう片方が偽であることを排他的論理和と呼びます。

条件P 条件Q AND
×
×
×
× × ×

一般的にプログラミング言語では記号「^」を利用して、

p ^ q

のように記述します。
Excelの式やVB系では「^」はべき乗の意味で利用されるので注意)

また、条件Pの値が決まっても条件Qの値が決まらないと判定できないため、短絡評価はありません。

定排他的論理和 (XNOR)

条件Pと条件Qがあるとき、PとQ双方が真または偽であることを否定排他的論理和と呼びます。

条件P 条件Q AND
× ×
× ×
× ×

一般的にプログラミング言語では記号「^」を利用して、

!(p ^ q)

のように記述…するんですかね?あんまりしない気もしますね。

XORとかXNORって使う?

要するにAND、OR、XORとその反転(否定)があるよって話なのですが、
せっかく演算子まで用意してくれてますけど、「^」ってコード上で見ることあんまりないですよね。

めったに使う場面がないのだから、使えるタイミングでは積極的に使っていこう!っていうのもいいのですが、
自分は分かっても他の人的には混乱するかも?って思うと使いにくいのですよね。

で、そもそもの話、XORの「PとQどちらか片方が真で、もう片方が偽である」
っていうのはPとQの結果が一致していない、つまり、

p != q

なんですよね。

同じように、XNORの「PとQ双方が真または偽である」
っていうのはPとQの結果が一致している、つまり、

p == q

ってこと。

なんかこっちのほうが見慣れてるからいいかなって思うのです。

まぁ、「ここは排他的論理和が正しくない?」とかいったらかっこいいのかもしれないですけどね。
ちなみに「排他的論理積」なんて言葉はないですよ。ですよー。