// 如果是在数组中,i、j的位置一样,就会将 i 和 j的值都设置为 0
a = A, b = B
a = a ^ b;// A ^ B
b = a ^ b;// A ^ B ^ B = A
a = a ^ b;// A ^ B ^ A = B
2.提取一个二进制的最右侧为1的位置
a & ( - a)
> 推导
>
> -a = ~ a + 1
> a = 01101000
>
> ~a = 10010111
> ~a+1= 10011000
> a + (~a + 1) = 1,0000,0000 = 0
> 所以 -a = ~a + 1
> a & (-a) = 00001000
3. arr中,只有一个数,出现奇数次
publicintfindVal(int[] arr){int a =0;for(int i =0; i < arr.length; i++){
a = a ^ arr[i];}return a;}
4. arr中,有两个数,出现奇数次
publicint[]findVal2(int[] arr){int eor =0;for(int i =0; i < arr.length; i++){
eor ^= arr[i];}int rightOne = eor &(-eor);int eor1 = eor;for(int i =0; i < arr.length; i++){if((rightOne & arr[i])== rightOne){
eor1 ^= arr[i];}}int b = eor ^ eor1;returnnewint[]{eor1, b};}
5. arr中,只有一个数出现了K次,其他数都出现了M次(K < M, M > 1)
publicintfindVal2(int[] arr,int M,int K){int[] times =newint[32];for(int i =0; i < arr.length; i++){for(int j =0; j <32; j++){
times[j]+=((1<< j)& arr[i])>0?1:0;}}int res =0;for(int i =0; i < times.length; i++){if(times[i]% M == K){
res |=1<< i;}}if(res ==0){int count =0;for(int i =0; i < arr.length; i++){if(arr[i]==0){
count++;}}if(count == K){return res;}return-1;}return res;}
相关性质0 ^ N = NN ^ N = 0交换律 A ^ B = B ^ A结合律 (A ^ B) ^ C = A ^ (B ^ C)题目1. 不用临时变量交换两个数 // 如果是在数组中,i、j的位置一样,就会将 i 和 j的值都设置为 0 a = A, b = B a = a ^ b; // A ^ B b = a ^ b; // A ^ B ^ B = A a = a ^ b; // A ^ B ^ A = B2.提取一个二进制的最右侧为