/**
* @author chencc
* @Description 异或运算
* @Date 2022/3/2 11:07
*/
public class Xor {
//一个数组中有一种数出现了奇数次,其他数都出现了偶数次
public static void printOddTimesNum1(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
System.out.println(eor);
}
//一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
public static void printOddTimesNum2(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
//假设这两个数为a,b,那么eor = a^b;
//获取eor最右侧的1
int rightOne = eor & (-eor);
//arr数组可以分为rightOne存在1,rightOne不存在1两类
//将所有rightOne存在1的异或进eorTemp 得到其中一个值
int eorTemp = 0;
for (int i = 0; i < arr.length; i++) {
if ((arr[i] & rightOne) != 0) {
eorTemp ^= arr[i];
}
}
int otherEor = eor ^ eorTemp;
System.out.println(eorTemp);
System.out.println(otherEor);
}
//怎么把一个int类型的数,提取出最右侧的1来
public static void getRightOne(int num) {
print(num);
int one = num & (-num)/**num & (~num +1)*/;
print(one);
}
public static void main(String[] args) {
/*int[] arr = new int[]{1,2,3,1,3};
printOddTimesNum1(arr);*/
//getRightOne(12);
int[] arr = new int[]{1, 1, 3, 4, 6, 7, 4, 4, 3, 6, 6, 6, 7, 8};
printOddTimesNum2(arr);
}
public static void print(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
}
异或运算获取数组中出现奇数次的数
于 2022-03-02 14:43:59 首次发布