异或运算,相同为0,不同为1
方便记忆,可以记为无进位相加。
异或运算的性质: 1)0^N == N N^N == 0 2) 异或运算满足交换律和结合律
如何提取一个数二进制位的最右侧的1
N&((~N)+1)
- 如何不用额外变量就交换两个数的值
a=a^b
b=a^b
a=a^b
2.一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数? 代码超级简单:
public static void printOddTimesNum1(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
System.out.println(eor);
}
3.一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数?
/**
* 假如arr中 a和b出现了一次,其余数都出现了两次
* @param arr
*/
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
}
//a!=b 所以 eor != 0
//提取eor最右侧的1
int eorq = eor ^ ((~eor) + 1);
int a = 0;//因为 0^N == N 所以a可以初始化为0
for (int i = 0; i < arr.length; i++) {
if ((eorq&arr[i]) == 0) {
a ^= arr[i];
}
}
int b = eor ^ a;
System.out.println(a);
System.out.println(b);
}