一点一点前进...

0%

不用临时变量交换两个数

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

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

1
2
3
4
5
6
static void Swap(ref int a, ref int b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}

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

1
2
3
4
5
原始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值一样。
综上,交换了a和b的值。

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