/**
* 题目描述:在一个数组中,有两个数出现了奇数次(假设是a和b),其它数出现了偶数次,
* 找出a和b并将它们打印出来
* @param nums
*/
public static void printOddTimesNum2(int[] nums){
int eor = 0;
for (int i=0;i<nums.length;i++){
//最终结果:eor = a ^ b
eor ^= nums[i];
}
//找到eor最右侧的那个1
//eor: 0010 1010 0010 1000
//-eor: 1101 0101 1101 1000
int rightOne = eor & (-eor);
int onlyOne = 0;
for (int i=0;i<nums.length;i++){
/*
* 有了最右侧的1之后,我们就可以把数组中的数分为两组:一组是这一位上为1的,另一组是这一位上为0的
* 并且a和b必然是处于不同的组中,因为如果它们是同一组,这一位上就是0了,所以我们就可以单独将这一位
* 上为1的那一组拿出来进行异或,必然可能得到a或者b,最后和eor异或就能得到另一个数了
*/
if ((nums[i] & rightOne) != 0){
onlyOne ^= nums[i];
}
}
System.out.println("出现奇数次的两个数分别为:" + onlyOne + "和" + (eor ^ onlyOne));
}