异或^:相同为0,不同为1。相当于无进位相加。
1、交换两数的值(无其他空间开销)
void swap(int[] arr,int i.int j){
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
2、找出数组中唯一一个重复奇数次的数
int findNum(int[] arr){
int res=0;
for(int i=0;i<arr.size();i++){
res=res^arr[i];
}
return res;
}
3、找出数组中仅有的两种各自出现奇数次的数
//设出现奇数次的两个数分别为a,b
void func(int[] arr){
int eor=0;
for(int i=0;i<arr.length;i++){
eor^=arr[i];
} //此时eor的值即是a^b的值
int rightOne= eor&(~eor+1); //提取出eor最右边的1
int eor1=0;
for(int cur:arr){
if((cur&rightOne)==0){
eor1^=cur;
}
} //此时eor1是a或者b中的任意一个
cout<<"出现次数为奇数次的一个数为:"<<eor1<<",另一个数为:"<< (eor^eor1) <<endl;
}