通过异或(^)实现基本数据类型(浮点型除外)值互换

一般情况下,我们要实现值替换的时候需要引入一个中间变量,以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值的互换

posted @ 2022-09-22 11:02  like_a_star  阅读(33)  评论(0编辑  收藏  举报