0.开头
之前一篇https://blog.csdn.net/qq_32760017/article/details/88891468
《Java-随便写写-实现变量值交换和随机数的生成》只写了两种基本的方法;
这里补充异或实现变量值交换的方法。
1.先结论
直接上代码:
public class ExchangeValue {
public static void main(String[]args){
int a = 55;
int b = 66;
a = a^b;
b = a^b;
a = a^b;
System.out.println("a="+a);
System.out.println("b="+b);
}
}
运行结果没有问题:
a=66
b=55
2.后原理
为什么连续三次异或能够实现数值交换呢?
a = a^b;//第一句
b = a^b;//第二句
a = a^b;//第三句
我们一句一句看:
- a = a^b:第一句实际上是在【记录】两个数当中【不一样】的比特位!
(i)为什么这么说?
(ii)我们思考a和b的二进制形式,异或计算之后二者不同的位置都变成了 【1】,相同位置都变成了【0】;
(iii)计算完成后,a存储的其实就是不同位位置为【1】,相同位位置为【0】的信息; - b = a^b:第二句实现了将a的二进制位值全部传递给了b!
(i)具体是如何实现的呢?
(ii)我们把这个交换值的问题分解:a的值要传给b,那么只要【换掉b中和a不一样的位】就好了!
(iii)而第一句我们说了,a在经过第一步之后,相同位位置是【0】,不同位位置都是【1】;所以,第二句的运算过程中,b遇到【1】时希望换掉自己的值,遇到【0】时值不变。
(iiii)实际上呢?正是如此!无论b对应位置是【1】还是【0】,遇到【0】异或之后都不会变;另一边,无论b对应位置是【1】还是【0】,遇到【1】都会变!所以完成任务! - a = a^b;这一句与上面的一句是一样的!此时的a依然存储着不同位位置的【1】和相同位位置的【0】,此时的b已经成了之前的a,所以运算之后,刚好得到最原始的b值!