概要
- XOR 演算の基本的な性質とその応用例を解説
- インタビュー問題 でよく使われるXORトリックの仕組みを説明
- 配列から欠損値や重複値 を見つけるためのXORの利用方法を紹介
- スワップや複数欠損・重複検出 など、幅広い応用例を提示
- 直感的なアルゴリズムとの比較 も含め、XORの強力さを実感できる内容
XORトリックの基礎とその性質
- XOR(排他的論理和) は、ビットごとに比較し、同じ値なら0、異なる値なら1を返す演算
- 真理値表 を使い、XORの動作を視覚的に確認可能
- ビット列 全体に適用でき、整数だけでなく様々な値にも利用可能
- XORの主な性質
- x ^ 0 = x :0とのXORは元の値を返す
- x ^ x = 0 :同じ値同士のXORは0になる
- 交換法則(x ^ y = y ^ x) :順序を変えても結果は同じ
- 重複する値をすべて消去 できるため、特定のパターン検出に強力
XOR応用例1:インプレーススワップ
- 補助変数なしで2つの値を交換 可能
- 実装例(Python風擬似コード)
- x ^= y
- y ^= x
- x ^= y
- 各ステップの値の変化 を追うことで、XORの性質でスワップが成立する理由を理解
XOR応用例2:配列から欠損値を見つける
- 1からnまでの整数のうち、1つだけ欠損している配列 が与えられる問題
- XORですべての値と配列要素をXORし合う ことで、重複が消え、欠損値が残る
- 実装例(Python風擬似コード)
- result = 0
- 1からnまでXOR
- 配列Aの全要素をXOR
- resultが欠損値
- 直感的な加算・減算による解法 との比較
- 加算・減算でも同様のロジックだが、XORはオーバーフローの心配がなく型の制約が少ない
XOR応用例3:配列から重複値を見つける
- 1からnまでの整数のうち、1つだけ重複している配列 が与えられる問題
- XORで全ての値と配列要素をXORし合う と、重複値が3回現れるため、その値が残る
- x ^ x ^ x = x の性質を利用
XOR応用例4:2つの欠損値・重複値を見つける
- n個中2つだけ欠損、または重複している場合 の検出方法
- 全体XORでu ^ v(2つの値のXOR) が残る
- uとvの異なるビット位置で配列と全体を2分割 し、それぞれで再度XORを実行
- 1つ目のグループで1つ目の値、2つ目のグループで2つ目の値を特定
- ビットごとの分割 で、2つの値を効率的に抽出
まとめ
- XORトリック は、データ構造やアルゴリズムの知識がなくても、 特定の問題に対して驚くほど簡潔な解法 を提供
- インタビュー問題 としてはやや特殊だが、 知っていると役立つ強力な手法
- 整数以外にも応用可能 で、幅広い分野で利用価値が高い
- 直感的な加算・減算との違い や、 複数値の検出 におけるXORの有用性が際立つ