@Test
public void yier(){
int []arr = {1,2,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9};
//假设这两个数设为 a,b
int eor = 0;
for(int i : arr)
eor ^= i;
//此时eor = a ^ b
int eroe = 0;
/*
* 假设此时 arr = [a,b]
* 由于 eor = a ^ b != 0
* 所以 eor 的二进制至少有一位上的数为 1 才能使 eor != 0
* 假设第八位上的数为 1 ,则可以靠其区分 a和b
* */
//源码与反码相与,得到靠右边为1的数
int rightOnly = eor & (~eor + 1);//提取出最右边的1
//遍历数组 arr = [a,b]
for(int i : arr){
if((rightOnly & i) == 0){
eroe ^= i;
}
}//此时 eroe = a 或 b
int a = eor ^ eroe;
int b = eroe;
System.out.println(a+" "+b);
}
代码来自视频学习:bilibili.com/video/BV13g41157hK?p=2