1. ホーム
  2. language-agnostic

[解決済み] XOR変数のスワップはどのように行われるのですか?

2023-08-27 02:31:53

質問

2つの変数のXORスワップが、temp変数なしでどのように動作するのか、誰か説明してください。

void xorSwap (int *x, int *y)
{
    if (x != y) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
    }
}

私はそれが何をするのか理解していますが、誰かそれがどのように動作するかのロジックを介して私を歩くことができますか?

どのように解決するのですか?

代入をすることで、どのように動作するかがわかります。

x1 = x0 xor y0
y2 = x1 xor y0
x2 = x1 xor y2

代入する。

x1 = x0 xor y0
y2 = (x0 xor y0) xor y0
x2 = (x0 xor y0) xor ((x0 xor y0) xor y0)

xorは完全な連想・可換であるため。

y2 = x0 xor (y0 xor y0)
x2 = (x0 xor x0) xor (y0 xor y0) xor y0

以降 x xor x == 0 は任意のxに対して

y2 = x0 xor 0
x2 = 0 xor 0 xor y0

また x xor 0 == x は任意のxに対して

y2 = x0
x2 = y0

そして、入れ替えが完了しました。