UnsplashのLidia Nemiroffが撮影した写真
排他的論理和(XOR)は、2つの条件のうち片方だけが真のときに真を返す論理演算です。ORと似ていますが、両方が真のときは真にしない点が異なります。この性質は、パリティチェック、差分抽出、ビット演算、条件分岐などで役立ちます。ここでは、基本の考え方から真理値表、代表的な使いどころ、実装のしかたまでを順に見ていきます。
排他的論理和とは、論理演算の一種で、2つの条件のうちどちらか一方だけが真のときに真を返す演算です。英語ではeXclusive ORと呼ばれ、一般にXORと略されます。
論理演算とは、真偽(真または偽)を入力として受け取り、真偽を出力する演算の総称です。代表例として、次のようなものがあります。
排他的論理和はXOR(eXclusive OR)とも呼ばれます。論理和(OR)が「少なくとも一方が真なら真」なのに対し、XORは同時に真になるケースを真にしない点が特徴です。
排他的論理和の真理値表は次の通りです。
| 条件1 | 条件2 | 結果 |
|---|---|---|
| 偽 | 偽 | 偽 |
| 偽 | 真 | 真 |
| 真 | 偽 | 真 |
| 真 | 真 | 偽 |
片方だけが真のときだけ真と覚えると混乱しにくくなります。
XORは、2つの条件が同じ値(真・真、偽・偽)なら偽になります。つまり「違っているかどうか」を判定する演算として見ると理解がスムーズです。
真偽を0/1で表すと、排他的論理和は次のように整理できます。
| 入力A | 入力B | 出力 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
両方が0(偽)なので、片方だけが真という条件を満たさず、出力は0になります。
AとBが異なる(片方だけが真)ので、出力は1になります。
この場合もAとBが異なるため、出力は1です。
両方が真になるケースは、XORでは真にしません。ここがORとの決定的な違いです。
排他的論理和が実際に使われるのは、「2つが違っているときだけ反応する」「一致していない部分だけを取り出す」といった性質があるためです。この性質を活かして、誤り検出、マスク処理、差分抽出などで使われます。
パリティチェックは、データ転送時の誤り検出に使われる基本的な仕組みです。データ列に対してXORでパリティを計算し、受信側でも同様に計算して一致するかを確認します。単純ですが、奇数個のビット誤りを検出できるため、特に1ビット誤りの検出でよく使われます。一方で、偶数個の誤りは見逃すことがあります。
XORは「同じ値で2回XORすると元に戻る」という性質があります。このため、暗号の構成要素(例:ストリーム暗号におけるマスク処理)、ログのマスキング、簡易的なチェック処理などで使われます。ただし、XORだけで安全な暗号になるわけではありません。暗号化を目的とする場合は、既存方式や鍵管理を含めた設計に沿って検討する必要があります。
ビット列や画像などを「同じ形式のデータ」として扱える場合、XORは差分抽出に使えます。たとえば2つのビットマップをXORすると、一致していない部分だけが残る形になり、比較や検出の前処理として利用できます。
ニューラルネットワークの文脈では、「XORを正しく分類できるか」は定番の題材です。これは、XORが線形分離できず、単一のパーセプトロンでは扱えないためで、多層化や非線形性の必要性を説明する例としてよく登場します。なお、XORが「活性化関数」として使われる、という説明は一般的ではありません。
XORはソフトウェアでもハードウェアでも基本演算として扱われます。実装で最初に切り分けたいのは、ビット列に対する演算なのか、真偽値に対する論理なのかという点です。ここが曖昧だと、同じ記号でも読み手の理解と実際の動きがずれることがあります。
多くの言語ではXOR演算子が用意されています。注意点として、演算対象が「ビット列」なのか「真偽値」なのかで意味が変わる場合があります。
^ はビット単位XOR(整数向け)^ は整数ではビットXOR、booleanでは論理XOR^ はビットXOR(整数・boolでも利用可)。bool同士の「論理としてのXOR」は != でも表現できます例として、C言語のビットXORは次の通りです。
int a = 1;
int b = 0;
int result = a ^ b; // ビット単位のXOR
ブールの条件同士で「どちらか一方だけ」を表したい場合は、整数のビット演算と混同しないよう、言語仕様に合わせて書き分けた方が誤読を防ぎやすくなります。
XORは回路として実装しやすく、CPUや各種デバイスにはXORを実行するための回路や命令が用意されています。ビット演算としてのXORは用途が広いため、基本命令として高速に処理される形で提供されることが一般的です。
XORは、AND、OR、NOTを組み合わせて表現できます。代表的な形は次の通りです。
A XOR B = (A AND (NOT B)) OR ((NOT A) AND B)
「片方だけが真」という定義が、そのまま式になっていると捉えると理解しやすくなります。
入力の組み合わせが少ない場合は、真理値表をそのままルックアップテーブルとして実装する方法もあります。組み込みや高速化の文脈では、分岐を減らしたいときの選択肢になります。
排他的論理和は、2つの条件のうち片方だけが真のときに真を返す論理演算です。XORとも呼ばれ、「違っているときだけ反応する」性質を活かして、パリティチェック、差分抽出、ビット演算、暗号の構成要素など幅広い場面で使われます。ORと混同しやすいものの、両方が真なら偽になる点を押さえておくと整理しやすくなります。実装では、ビット演算と論理演算の違いを意識しておくと、意図しない書き間違いを減らしやすくなります。
2つの条件のうち、どちらか一方だけが真のときに真を返す論理演算です。
ORは少なくとも一方が真なら真ですが、XORは両方が真のケースを真にしません。
「2つが違っているときだけ真」と覚えると、真理値表と対応づけやすくなります。
パリティチェック、差分抽出、ビットマスク処理、暗号の構成要素などで使われます。
ビット列の整合性を簡単に計算でき、ビット反転などの誤り検出(特に1ビット誤り)に使われるためです。
なりません。XORは暗号の部品としては有用ですが、鍵管理や方式設計が不十分だと安全性は確保できません。
多くの言語で ^ が使えます。整数のビットXORなのか、真偽値の論理XORなのかは言語仕様で確認すると安全です。
bool同士なら「異なるときにTrue」になるため、XORと同じ結果を表せます。ただし、整数などに対する != とは意味が異なるため注意が必要です。
作れます。AND、OR、NOTを組み合わせて (A AND NOT B) OR (NOT A AND B) の形で実現できます。
単純な線形分類では解けないため、多層化や非線形性の重要性を説明する定番例として使われるからです。