排他的論理和(XOR)とは?真理値表・性質・ビット演算から暗号・誤り検出・RAIDまでの実践解説

排他的論理和(XOR)とは

排他的論理和(exclusive OR, 略して XOR)は、論理演算およびビット演算の基本的な演算子の一つで、2つの入力が異なるときに真(1)を返し、同じときに偽(0)を返す演算です。論理記号では ⊕ や XOR と表記され、集合論では対称差(symmetric difference)としても知られます。真理値的には「どちらか一方が真であるが両方は真でない」という意味合いです。

真理値表と論理式

  • 真理値表(2入力):
    • A = 0, B = 0 → A ⊕ B = 0
    • A = 0, B = 1 → A ⊕ B = 1
    • A = 1, B = 0 → A ⊕ B = 1
    • A = 1, B = 1 → A ⊕ B = 0
  • 論理式の等価表現:
    • A ⊕ B = (A ∧ ¬B) ∨ (¬A ∧ B)
    • A ⊕ B = (A ∨ B) ∧ ¬(A ∧ B)
    • ブール代数的には A ⊕ B = A + B (mod 2) と表せ、0/1の加算の剰余で表現されます。

基本的性質(代数的特徴)

  • 可換性: A ⊕ B = B ⊕ A
  • 結合性: (A ⊕ B) ⊕ C = A ⊕ (B ⊕ C) (複数入力のXORは順序に依存しない)
  • 単位元: A ⊕ 0 = A
  • 自己逆元: A ⊕ A = 0(同じ値を二度XORすると消える)
  • 反転: A ⊕ 1 = ¬A(単一ビットに対して)
  • 線形性: XORはGF(2)上の加算であり、線形代数的扱い(線形写像や行列操作)に適用できる。
  • 分配性: 論理積(AND)はXORに対して分配する:A ∧ (B ⊕ C) = (A ∧ B) ⊕ (A ∧ C)。ただしXOR自体がANDに対して分配的であるとは限りません。

ビット演算としてのXOR

コンピュータの世界ではXORはビットごとの排他的論理和としてよく使われます。例えば8ビットの数値同士をXORすると、対応する各ビットごとに排他的論理和が計算されます。例:5(0101) ⊕ 3(0011) = 6(0110)。

多くのプログラミング言語では ^ がビット単位のXOR演算子として用いられます(C/C++/Java/JavaScript/Python など)。ブール値に対しても ^ は論理XORとして働く言語が多いです。

主な利用例と応用

  • 暗号(ストリーム暗号・ワンタイムパッド):

    XORは暗号で基本的かつ重要な役割を果たします。平文と鍵をビットごとにXORすることで暗号化・復号が可能です(C = P ⊕ K、P = C ⊕ K)。理想的な一度だけ使われるランダム鍵(ワンタイムパッド)の場合、XORによる暗号化は情報理論上安全です。ただし鍵の再利用や鍵の弱さがあると致命的に脆弱になります。

  • 誤り検出と訂正、パリティ:

    XORはパリティビット計算に使われます。ビット列の全てをXORすると“1の個数が奇数か偶数か”(奇パリティ/偶パリティ)が分かります。簡易的なエラー検出や組み合わせチェックにXORが使われます。

  • RAID(ストレージの冗長化):

    RAID-5などのパリティ計算でXORが用いられます。複数ディスクのデータをXORしたパリティ情報を保持することで、1台のディスク障害時に残りのディスクとパリティからデータを復元できます。XORは可逆で計算が軽い(排他的和をとるだけ)ため実用的です。

  • アルゴリズムとデータ構造:

    複数値の合成パリティ(総XOR)や、集合における対称差の計算、ハッシュや擬似乱数生成(LFSR)などで使われます。XORは線形で計算が速いため、ビットレベル操作を伴う最適化で多用されます。

  • プログラミングの小ネタ:

    変数の入れ替え(XORスワップ):a = a ⊕ b; b = a ⊕ b; a = a ⊕ b; で一時変数を使わず交換できる、というトリックがあります。ただし実務では可読性やエイリアス(同一メモリ参照)の問題、最適化済みコンパイラの振る舞いを考えると推奨されません。

数学的観点・集合論との関係

XORは二元体 GF(2) の加算と一致します。これにより線形代数の手法が使え、行列の各要素を GF(2) 上で扱えば、XOR による演算で連立系の解法や符号理論(誤り訂正符号設計)に応用できます。また集合論的には、集合 A, B の対称差 A △ B(A と B のどちらかに属するが両方には属さない元の集合)は要素ごとのXORに対応します。

注意点と誤解しやすいポイント

  • XORは「排他OR」と呼ばれますが、通常の OR(論理和)とは異なる真理値を返します。両方が真のとき OR は真ですが XOR は偽になります。
  • 単純だからこその落とし穴:暗号用途で鍵を再利用すると XOR の可逆性が逆に弱点となり、二つの暗号文をXORすると二つの平文のXORが得られ情報漏洩につながることがあります(ワンタイムパッドの誤用事例)。
  • データ型に注意:多くの言語で ^ はビット演算子なので、符号付き整数やサイズによっては期待通りの振る舞いをしないことがあります。論理XORとビットXORを区別して扱ってください。
  • XORスワップは実際にはメリットが少なく、読みやすさと安全性の観点から一時変数を使った交換の方が推奨されます。

実例:幾つかの使い方を短く示す

  • パリティ検査:bits = b0 ⊕ b1 ⊕ b2 ⊕ ... ⊕ bn → 0(偶数個の1)/1(奇数個の1)
  • マスク操作:x ⊕ mask でマスクされたビットを反転(maskの1のビットのみ反転)
  • 簡易暗号:cipher = plaintext ⊕ keystream、復号は同様に plaintext = cipher ⊕ keystream

まとめ

排他的論理和(XOR)は、真理値レベルでもビットレベルでも極めて重要な演算であり、可換性・結合性・自己逆性などの性質から幅広い応用が可能です。暗号、誤り検出、ストレージの冗長化、低レベルの最適化など、多くの分野で必須のツールとなっています。一方でその単純さゆえに使いどころや制約(鍵の再利用や型の違いなど)を誤ると脆弱性やバグにつながることもあるため、用途に応じた理解と注意が必要です。

参考文献