UnsplashのLidia Nemiroffが撮影した写真
この記事では、排他的論理和をわかりやすく解説します。基本の考え方から代表的な使いどころ、実装のしかたまで押さえることで、ロジックの見通しがよくなり、意図しないバグも減らしやすくなります。
排他的論理和とは、論理演算の一種で、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との決定的な違いです。
排他的論理和は「違いを取り出す」「一致しないときだけ反応する」といった性質を活かして、さまざまな場面で使われます。
パリティチェックは、データ転送時の誤り検出に使われる基本的な仕組みです。データ列に対してXORでパリティを計算し、受信側でも同様に計算して一致するかを確認します。単純ですが、1ビット誤りの検出などで役立ちます。
XORは「同じ鍵で2回かけると元に戻る」という性質があります。このため、暗号の構成要素(ストリーム暗号の基本形)や、ログのマスキング、チェック用途の簡易的な加工などで使われます。ただし、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とも呼ばれ、「違っているときだけ反応する」性質を活かして、パリティチェック、差分抽出、ビット演算、暗号の構成要素など幅広い場面で使われます。実装は演算子で簡単に書ける一方、ビット演算と論理演算の違いを意識すると、読みやすさと安全性が上がります。
2つの条件のうち、どちらか一方だけが真のときに真を返す論理演算です。
ORは少なくとも一方が真なら真ですが、XORは両方が真のケースを真にしません。
「2つが違っているときだけ真」と覚えると、真理値表と対応づけやすくなります。
パリティチェック、差分抽出、ビットマスク処理、暗号の構成要素などで使われます。
ビット列の整合性を簡単に計算でき、1ビット誤りの検出などに役立つためです。
なりません。XORは暗号の部品としては有用ですが、鍵管理や方式設計が不十分だと安全性は確保できません。
多くの言語で ^ が使えます。整数のビットXORなのか、真偽値の論理XORなのかは言語仕様で確認すると安全です。
bool同士では「異なるならTrue」になるため、論理としてのXOR表現として使えます。整数などでは意味が異なるため注意が必要です。
作れます。AND、OR、NOTを組み合わせて (A AND NOT B) OR (NOT A AND B) の形で実現できます。
単純な線形分類では解けないため、多層化や非線形性の重要性を説明する定番例として使われるからです。