不使用临时变量交换两个数
编写一个函数,不用临时变量,直接交换两个数。
很经典的一道题目,先直接给代码,然后再证明。
因为是比特操作,所以我们针对每个比特证明即可。不妨设 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!