数组中有两种数出现了奇数次,其他数都出现了偶数次,分别找出出现奇数次的数

public static void printOddTimesNum2(int[] arr) { int eor = 0; for (int c : arr) { eor ^= c; } //eor = a^b //eor != 0; //eor二进制位必然有一位等于1 int rightOne = eor & (~eor + 1); //原码&补码 = 提取最右1位的 1 int eor1 = 0; for (int i = 0; i < arr.length; i++) { if ((arr[i] & rightOne) == 1) { //找出最右1位是1的数做异或运算 注意:出现偶数次的数异或后=0 eor1 ^= arr[i]; //此时eor1 = 出现奇次数的其中一个 } } int otherOdd = eor1 ^ eor; System.out.println(eor1 + " " + otherOdd); }
//int[] arr2 = {1, 2, 2, 3, 1, 4, 1, 3, 3, 3, 4, 4, 4, 4};
运行结果:
1 4
如何提取二进制最右的1

学习的博客多用于在笔记中,防止笔记过于臃肿,所以将样例及运行结果放在博客中,后以超链接的形式记录在笔记中,所以有些博文过于单薄。如果有小伙伴遇到问题欢迎评论,看到就会回复,学渣一枚,加油努力。

浙公网安备 33010602011771号