题目1:设数组{3,2,1,7,2,3,7},除一个数字外,其它数字都是成对出现,求如何快速找出只出现了一次的数字?
解:
public static void main(String[] args) {
int[] array = new int[]{3,2,1,7,2,3,7};
int result = array[0];
for (int i = 1; i < array.length; i++) {
result = result ^ array[i];
}
System.out.println(result+" 只出现了一次");
}
结果:
可以看到上面循环只用了一个很简单的符号:^ ,居然就把1给拎出来了,那么它到底是什么魔法,这么神奇?
^ 是一个位运算符,也就是CPU计算的时候,针对二进制做的运算,就叫位运算,它的原理其实很简单
相同得0,不同得1 ,例如:
(1)4 ^ 7 ^ 4
4 二进制为: 1 0 0
7 二进制为: 1 1 1
1 0 0
1 1 1
一一一
0 1 1
第一次异或结果是 3
0 1 1
1 0 0
一一一
1 1 1
第二次异或结果就是 7
于是就把唯一的7 拎出来了
题目2: 不声明第三个变量的前提下交互 a , b的值
public static void main(String[] args) {
int a = 3;
int b = 6;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a+":"+b);
}
牛啊牛啊,这个 ^ 又是什么魔法,怎么实现的呢?
其实跟上面的一样。原理都是相同取0,不同取1:
(1)a = a ^ b;
3 = 0 1 1
6 = 1 1 0
所以:
0 1 1
1 1 0
一一一
1 0 1
1 0 1 十进制是 7
所以第一步 a = 7
(2) b = a ^ b;
1 0 1
1 1 0
一一一
0 1 1 十进制是 3
所以 b = 3
(3) a = a ^ b;
经过上两步,a = 7 , b = 3
1 0 1
0 1 1
一一一
1 1 0 十进制是 6
所以a = 6