1. 异或的本质
异或可以看作是数二进制位上的每一位无进位相加,如: 6^5
如图所示,从低位到高位,依次相加,0+1 = 1, 1+0=1, 1+1=2 ,有进位,把进位抛弃,剩下到就是0
2. 异或到性质
2.1 多个数进行异或,数的顺序不影响最后的结果
int a = 5;
int b = 6;
int c = 4;
System.out.println((a ^ b ^ c) == (b ^ a ^ c)); // true
因为多个数进行异或,只关心所有数的二进制位上那一位1的个数,如果1为奇数个,则每一个数的这一位相加最后结果就是1,如果是偶数个1,则每一个数的这一位相加最后结果就是0.与数的顺序无关。
2.2 重要关系式
n ^ 0 = n
n ^ n = 0
3 异或的应用
3.1 交换两个数
int a = 10;
int b = 20;
a = a^b;
// 把a替换成 a^b,则:
// a^b^b = a^0 = a
b = a^b;
// 把 a替换成 a^b, 把b 替换成a
// a^b^a = a^a^b = 0^b = b
a = a^b;
3.2 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数
public static int findOddCountNumber(int[] nums){
int eor = 0;
for (int num : nums) {
eor ^= num;
}
return eor;
}
3.3 查找一个数二进制形式下1的个数
获取一个数最右侧的1
m = n & ((~n) + 1)
int n = 100;
// 0000 1010
// 1111 0101 + 1
// 1111 0110 & 0000 1010 = 0000 0010
int result = n & ((~n) + 1);
最后的代码如下:
int count = 0;
while (n > 0) {
int rightOne = n & ((~n) + 1);
// 删除最右边的1,并把 删除1后的值重新赋值给 n
n ^= rightOne;
count++;
}