不使用临时变量交换两个数

编写一个函数,不用临时变量,直接交换两个数。

很经典的一道题目,先直接给代码,然后再证明。

static void Swap(ref int a, ref int b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

因为是比特操作,所以我们针对每个比特证明即可。不妨设 ab 只有 1 比特,总共只有 4 种可能性,使用穷举法来证明。

原始a 原始 b 第一行 a 第二行 b 第三行 a
0 0 0 0 0
0 1 1 0 1
1 0 1 1 0
1 1 0 1 1

可以看出来,原始 a 和第二行左边的 b 是一样的,也就是最后的 b 值和初始的 a 值一样;原始 b 和第三行左边的 a 是一样的,也就是最后的 a 值和最初的 b 值一样。

综上,交换了 ab 的值。

但是,这个解法有个 bug,如果传入的是同一个地址呢?位异或操作后得到了 0!