代码中经常需要交换两个数的值,常见方法是新建一个中间变量temp,通过temp暂存数字的方法实现交换。
int a=5;
int b=10;
int temp;
//交换
temp=a;
a=b;
b=temp;
现在通过 异或操作^ 来实现交换。
int a=5;
int b=10;
//交换
a=a^b;
b=a^b;
a=a^b;
System.out.println("a和b的值分别是: "+a+" "+b);
输出:
结果可以看出,在没有中间变量的情况下,只进行3步异或操作就实现了交换,这是怎么一回事呢?
要从异或的性质说起,主要有四个:
再回到上例代码中,第二步b=a ^ b,其实际数学表达是b=( a ^ b )^ b,由交换律和结合律可知,结果为a;
同理,第三步a=a ^ b,实际上是 a=(a ^ b) ^ ((a ^ b) ^ b),结果为b。
通过异或的办法可以巧妙的避开中间变量的问题,在数组操作时可以更加精炼。如下例:
反转数组中的元素:
int[] c1= new int[5];
for (int i=0; i<5; i++){
c1[i]=(int)(Math.random() * 10);
System.out.println("c1的第"+(i+1)+"个数是: "+c1[i]);
}
for (int i=0; i<(c1.length)/2; i++){
c1[i] = c1[c1.length - i - 1] ^ c1[i];
c1[c1.length - i - 1] = c1[c1.length - i - 1] ^ c1[i];
c1[i] = c1[c1.length - i - 1] ^ c1[i];
}
for (int i=0; i<c1.length; i++){
System.out.println("反转后c1的第"+(i+1)+"个数是: "+c1[i]);
}
输出: