XORによる値の交換

XORスワップトリックは一時変数なしで2つの値を交換します。仕組みをステップごとに、制限事項、実際に使うべき場面を学びます。

Bit Tricks

詳細な説明

XORスワップアルゴリズム

XORスワップは一時変数を使用せずに2つの変数を交換します:

a = a ^ b;
b = a ^ b;  // bが元のaに
a = a ^ b;  // aが元のbに

ステップごとの解説

a = 42(00101010)とb = 15(00001111)の場合:

ステップ1: a = a ^ b

  00101010
^ 00001111
──────────
  00100101  (a = 37)

ステップ2: b = a ^ b(新しいaを使用)

  00100101  (a = 37)
^ 00001111  (b = 15)
──────────
  00101010  (b = 42、元のa!)

ステップ3: a = a ^ b(新しいbを使用)

  00100101  (a = 37)
^ 00101010  (b = 42)
──────────
  00001111  (a = 15、元のb!)

なぜ動作するか

3つのXOR操作はXORの自己逆元性を使用して値をエンコード・デコードします。ステップ1の後、aa ^ bを保持します。ステップ2は(a ^ b) ^ b = aを計算(元のaをbに復元)。ステップ3は(a ^ b) ^ a = bを計算(元のbをaに復元)。

制限事項と注意点

  1. 同じ変数: abが同じメモリ位置を参照する場合(同じ配列インデックスなど)、x ^ x = 0のためXORスワップは値をゼロにします。

  2. パフォーマンス: レジスタリネーミングとアウトオブオーダー実行を持つ最新のCPUでは、XORスワップは各ステップが前の結果に依存するパイプライン依存チェーンを作成するため、一時変数の使用より実際には遅くなります。

  3. 可読性: JavaScriptの[a, b] = [b, a]やC++のstd::swapの方が明確で同等に高速です。

有用な場面

XORスワップは主にスタック空間のない極度にメモリ制約のある環境(組み込みシステム)やXORの性質の教育的な例として有用です。

ユースケース

競技プログラミングやコーディング面接で、XORスワップは古典的なビット操作の問題として登場します。なぜ動作するかの理解はXORの代数的性質の習熟を示します。実際には、RAMが数バイトしかない8ビットマイクロコントローラなど、スタックメモリが極度に限られた組み込みファームウェアで時折使用されます。

試してみる — Bitwise Calculator

フルツールを開く