不使用临时变量交换两个数
编写一个函数,不用临时变量,直接交换两个数。
很经典的一道题目,先直接给代码,然后再证明。
因为是比特操作,所以我们针对每个比特证明即可。不妨设 a 和 b 只有 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 值一样。
综上,交换了 a 和 b 的值。
但是,这个解法有个 bug,如果传入的是同一个地址呢?位异或操作后得到了 0!