使用位运算找出数组中两个奇数个的数

0 阅读1分钟
public static void main(String[] args) {
    // 位运算比算术运算快得多
    int[] arr = {1, 1, 2, 2, 2, 3, 3, 6, 6, 6, 7, 7};
    int eor = 0;
    // 异或结果不为0,则说明存在两个奇数个的数字
    for (int i : arr) {
        eor ^= i;
    }
    // 0010 ^ 0110 = 0100
    // System.out.println(eor); // 输出结果:4
    // 获取最右边的1
    int rightOne = eor & (~eor + 1);
    int onlyOne = 0;
    // 获取其中一个奇数个的数字
    for (int i : arr) {
        // 判断当前数字是否包含最右边的1
        if ((i & rightOne) == 1) {
            // 包含最右的1
            onlyOne ^= i;
        }
    }
    // 输出第一个奇数个的数字和第二个奇数个的数字
    System.out.println((eor ^ onlyOne) + " " + onlyOne);
}

输出结果: 2 6