抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

正常操作

正常交换两个整数我们需要创建一个临时变量。

1
2
3
4
5
int a = 1, b = 2;
int temp;
temp = b;
b = a;
a = temp;

temp变量用于保存b的值,避免被覆盖,最后赋值给a。

异或操作

但通过异或操作,我们可以不需要创建额外的临时变量来交换两个整数。

异或操作见原文链接

代码

1
2
3
4
int a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;

过程分析


第一步: 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

评论