如何在不使用中间变量的情况下交换两个数?
作者:互联网
使用^(异或)符号,^符号通常用于位运算。
当两个位相同时^运算为0,不相同时为1;
对于三个数,^运算满足交换律:(a^b)^c=a^(b^c);
因此我们可以使用异或运算进行两个数的交换,代码实现如下:
public static void swap(int i,int j) {
i=i^j;
j=i^j;
i=i^j;
}
现在进行逐段分析:
第一段:
i=i^j;
假设i为a,j为b,则i临时被赋值为a^b
第二段:
j=i^j;
因为在第一段里i已经被赋值为a^b,而j=b,所以这里i^j=(a^b)^b,由于异或交换律,所以也可变为a^(b^b),同一个数对他自己异或结果为0,所以又等于a^0,而一个数对0异或运算等于他自身,所以最后j=a;
第三段:
i=i^j;
这里i还是a^b,而j=a;所以i^j=(a^b)^a,同样使用异或交换律,使原式等于(a^a)^b,有第二段可得这里等于0^b,等于b,所以最后i=b;
这里最终完成了i和j的交换。
但是使用也有条件就是交换的两个数不能指向同一个地址
标签:交换律,变量,数对,交换,中间,异或,等于,运算 来源: https://blog.csdn.net/GrandeLai/article/details/121938098