代码实例
先看一下交换变量的常规方式:
public static void swap1() {
int i = 1, j = 5;
System.out.println("i:" + i + ",j:" + j);
int tmp=i;
i = j;
j = tmp;
System.out.println("i:" + i + ",j:" + j);
}
输出:
i:1,j:5
i:5,j:1
使用临时变量存储一下其中一个值,这种方法所有人都知道,且可以交换任何变量。
如果是int或者long等整数变量,还可以通过以下方式交换:
public static void swap2() {
int i = 4, j = 5;
System.out.println("i:" + i + ",j:" + j);
i = i ^ j;
j = i ^ j;
i = i ^ j;
System.out.println("i:" + i + ",j:" + j);
}
输出:
i:4,j:5
i:5,j:4
从代码可以看出,经过3次异或变量就换掉了。
什么是异或
要理解上面交换原理,我们先看看什么是异或:
- | 变量1 | 变量2 | 变量3 |
---|---|---|---|
值1 | 1 | 1 | 0 |
值2 | 0 | 1 | 0 |
结果 | 1 | 0 | 0 |
二进制异或的结果是:不同为1,相同为0
实例分析
以上例子中,第一次异或,结果=1:
- | 变量1 | 变量2 | 变量3 |
---|---|---|---|
值1 | 1 | 0 | 0 |
值2 | 1 | 0 | 1 |
结果 | 0 | 0 | 1 |
得出结果001就类似中间变量,在下面两次异或时,都得到另一个变量的值(4去异或就得到5,5去异或就得到4)
第二次异或,结果=4:
- | 变量1 | 变量2 | 变量3 |
---|---|---|---|
值1 | 0 | 0 | 1 |
值2 | 1 | 0 | 1 |
结果 | 1 | 0 | 0 |
第三次异或,结果=5:
- | 变量1 | 变量2 | 变量3 |
---|---|---|---|
值1 | 0 | 0 | 1 |
值2 | 1 | 0 | 0 |
结果 | 1 | 0 | 1 |
注意:这种交换变量方法也只适用于整数,float、double之类的是不行的