1)0 ^ N = N
2) N ^ N = 0
3) 同样一批数,有交换律和结合律,异或得到的结果一定是同一个。
交换律:a ^ b = b ^ a
结合律:(a ^ b) ^ c = a ^ (b ^ c)
其实都是来自于异或运算就是无进位相加这一个概念。
题目一:
一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个数?
思路:
将数组中所有数异或一遍,得到的数,就是最终的求值。

题目二:
怎么把一个int类型的数,提取出最右侧的1来
题目的画图如下:

怎么做呢?

为什么是a & (-a)呢?看演算草图:

a & (~a + 1) 可以得到结果,保留a最后侧的1。a 与上 (a取反 + 1),也就是a 与 a的相反数。也就是:
a & (-a)
package class02;
public class Code02_EvenTimesOddTimes {
// arr中,只有一种数,出现奇数次
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 main(String[] args) {
int a = 5;
int b = 7;
//这样运算下来,a和b发生交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);
System.out.println(b);
int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };
printOddTimesNum1(arr1);
}
}
--




















