一、异或运算:
异或运算(^):是一种位运算(二进制),位相同为0,位不同为1。
既然这样,那当一个数对自身进行异或运算时,那么所有的数位都为0了,结果不就等于0了?测试一下:
int a=2;
System.out.println(a^a); //0
果然为0,那么可以得出结论:x^x=0
然后进行原理测试:
int n=8; //1000
int m=0; //0000
System.out.println(n^m);//8=1000
由举例可以看出,对数值的二进制进行比较后,发现只有第一位不同,故值为8,转换为二进制为1000.针对以上举例可以推出,任何数与0进行异或运算,得到的都是自己本身。
接下来对大于两个数以上的进行异或运算。直接举例:
int n1=4; //0100
int n2=5; //0101
int n3=6; //0110
int n4=7; //0111
System.out.println(n1^(n2^n3)^n4); //0000
System.out.println(n1^(n3^n2)^n4); //0000
System.out.println(n1^(n4^n3)^n2); //0000
可以看出,位置并不是决定结果的要数。(有点像以前学的交换律)
二、异或的简单运用
当我们定义变量的时候,变量在使用的时候回占用内存,那么我们是不是可以通过减少内存的个数来对程序进行内存简单优化呢?这个时候异或运算就有一个自己的解决方案:
例如现在有一题:在不适用第三个变量的情况下,怎么将两个变量的值进行互换?答案如下:
int n=520;
int m=1314;
n=n^m;
m=n^m;
n=n^m;
System.out.println("n:"+n); //1314
System.out.println("m:"+m); //520
佛曰:“何故?”
我答:“第一步异或将n^m的值赋值给了n,这个时候在进行第二步异或,将n=n^m,换算进去:得到m=n^m^m,这个时候,因为异或运算对位置并没有影响,故先计算“m^m=0”,随后,化简后得到m=n^0=n,这个时候就将n的值赋值给了m。
然后看第三步异或运算:n=n^m;此时右边的n=n^m,m=n,故可以得到:n=n^m^n,按照上一步的步骤,可以得到n=m,即完成了题目要求的值的互换。”
佛曰:“好!”
本次的介绍就到这里咯,欢迎大家一起探讨更加深入的用法。如有错误,欢迎大家指正,共勉!