正常操作
正常交换两个整数我们需要创建一个临时变量。
1 | int a = 1, b = 2; |
temp变量用于保存b的值,避免被覆盖,最后赋值给a。
异或操作
但通过异或操作,我们可以不需要创建额外的临时变量来交换两个整数。
异或操作见原文链接
代码
1 | int a = 1, b = 2; |
过程分析
第一步: a = a ^ b;
完成后a
变成a ^ b
(1 ^ 2)。
第二步: b = a ^ b;
此时的a
存储的数据是a ^ b
(1 ^ 2)。所以b
就是b = (a ^ b) ^ b
(b = (1 ^ 2) ^ 2)。
异或操作下,相同的数异或会变成0
。根据结合律b = a ^ (b ^ b)
(b = 1 ^ (2 ^ 2))。所以会变成b = a ^ 0
(b = 1 ^ 0)。
零跟别的数异或会变成那个数。所以最后b = a
(b = 1)。
这不是和正常操作一样嘛?有什么区别呢?
注意此时我们的a
存储的数据是a ^ b
(1 ^ 2)。
b
变量虽然被覆盖掉了,但它仍有一部分存储在a
里面。
第三步: a = a ^ b
跟第二部一样,实际是a = (a ^ b) ^ b
。此时括号外的这个b值为1!(a = (1 ^ 2) ^ 1)。
结合律一下。(a = (1 ^ 1) ^ 2)。
最终a = 2, b = 1
。
我们成功地不使用额外变量交换了两个数!
通过异或的操作,让b变量被覆盖后仍然留有一部分灵魂在a里。所以才能成功交换。
本文参考自CSDN