XORによる値の交換
XORスワップトリックは一時変数なしで2つの値を交換します。仕組みをステップごとに、制限事項、実際に使うべき場面を学びます。
詳細な説明
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の後、aはa ^ bを保持します。ステップ2は(a ^ b) ^ b = aを計算(元のaをbに復元)。ステップ3は(a ^ b) ^ a = bを計算(元のbをaに復元)。
制限事項と注意点
同じ変数:
aとbが同じメモリ位置を参照する場合(同じ配列インデックスなど)、x ^ x = 0のためXORスワップは値をゼロにします。パフォーマンス: レジスタリネーミングとアウトオブオーダー実行を持つ最新のCPUでは、XORスワップは各ステップが前の結果に依存するパイプライン依存チェーンを作成するため、一時変数の使用より実際には遅くなります。
可読性: JavaScriptの
[a, b] = [b, a]やC++のstd::swapの方が明確で同等に高速です。
有用な場面
XORスワップは主にスタック空間のない極度にメモリ制約のある環境(組み込みシステム)やXORの性質の教育的な例として有用です。
ユースケース
競技プログラミングやコーディング面接で、XORスワップは古典的なビット操作の問題として登場します。なぜ動作するかの理解はXORの代数的性質の習熟を示します。実際には、RAMが数バイトしかない8ビットマイクロコントローラなど、スタックメモリが極度に限られた組み込みファームウェアで時折使用されます。