int rightOne = eor & (~eor + 1); //提取出最右的1
package com.butupi.bit;
/**
* 使用异或求 奇数次的数
* @description:
* @author:1252319301
* @version:
* @date: 2022年5月13日
*/
public class EvenTimesOddTimes {
//数组中一个数出现了奇数次
// 求一个
public static void printOddTimesNum1(int[] arr) {
int eor = 0;
for (int cur : arr) {
eor ^= cur;
}
System.out.println(eor);
}
//数组中两个数出现了奇数次
// 求两个
public static void printOddTimesNum2(int[] arr) {
int eor = 0;
for (int cur : arr) {
eor ^= cur;
}
//eor = a ^ b
//eor != 0
//eor必然有一个位置上是1
int rightOne = eor & (~eor + 1); //提取出最右的1
int onlyOne = 0; //eor'
for (int cur : arr) {
if ((cur & rightOne) == 0) { //只要一侧
onlyOne ^= cur;
}
}
System.out.println(onlyOne + " " + (onlyOne ^ eor));
}
public static void main(String[] args) {
int[] arr = {3,4,5,6,3,4,5,6,1,1,9};
int[] arr2 = {3,4,5,6,3,4,5,6,1,1,9,7};
printOddTimesNum1(arr);
printOddTimesNum2(arr2);
}
}