1.0^N==N;N^N==0
2.异或运算满足交换律和结合律
question1:不用额外变量交换两个数
int a=7;
int b=3;
a=a^b;
b=a^b;
a=a^b;
question2:一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这个数?
public static void Print(int [] arr) {
int eor=0;
for(int i=0;i<arr.length;i++) {
eor^=arr[i];//0与每一个数异或。
}
System.out.println(eor);
}
question3:一个数组中有两种数出现奇数次,其他数都出现了偶数次,怎么找到这两个数?
public static void Print2(int [] arr) {
int eor=0;
for(int i=0;i<arr.length;i++) {
eor^=arr[i];
}
//eor=a^b
//eor!=0
//eor必然有一个位置是1
int rightOne=eor&(~eor+1);//提取出最又的1,此时其他位都是0
int result1=0;//eor'
for(int cur:arr) {
if((cur&rightOne)!=0) {//保证同位是1
result1^=cur;
}
}
int result2=eor^result1;
if(result1<result2) {
System.out.println(result1+" "+result2);
}else {
System.out.println(result2+" "+result1);
}
}