一般情况下,我们要实现值替换的时候需要引入一个中间变量,以int
为例代码如下
int a = 10, b = 20;
// 中间变量
int temp;
temp = a;
a = b;
b = temp; // a = 20, b = 10
但是我们可以通过异或来简化代码,省略中间变量的使用,代码如下
int a = 10, b = 20;
a ^= b ^ (b = a);
执行结果如下
那么为什么可以通过异或来实现值的互换呢。b不是在等式中被替换为了a吗,为什么没有影响呢。
首先我们要知道在一个等式里,多次用到一个变量,在不存在赋值的地方,变量的值都为初始值,等式执行完后,该变量等于最后一次的赋值。例子代码如下
int a = 10,b = 20;
a = b + (b = 10) + (b = 30);
执行结果如下
在该处a = 20 + 10 + 30
结果为60且b = 30
符合上面的结论。
通过异或的概念我们可以知道1 ^ 0 = 1
,1 ^ 1 = 0
。根据这两个条件我们可以对a ^= b ^ (b = a)
如何实现值互换的来进行分析
a ^= b ^ (b = a)
等价于a = a ^ b ^ a
,~此处(b = a)
中的b已经被替换为了a
接着,我们根据1 ^ 1 = 0
可以得到a = a ^ b ^ a
等价与a = b ^ 0
最后根据1 ^ 0 = 1
可以得出a = b ^ 0
等价于 a = b
这样,我们就完成了a,b值的互换