异或运算:Exclusive OR。

OR 是什么意思呢?就是 x 和 y 有一个是真,就是真。而且要遵循就近原则:假如 x 为真,返回的就是 x 的值。

exclusive,排他的。专属的。也就是说,x 和 y 只能选一个。具体到二进制的运算,就是:

  • 1^1 = 0
  • 0^0 = 0
  • 1^0 = 1
  • 0^1 = 1

这次,我们来加个情境来更好的理解一下:

一个抽奖箱子里有两个球,一个黑球代表中了 100 亿,另一个白球代表凉凉。两人闭眼摸球。摸完后,只能有一个人中奖,要么是 A, 要么是B。 A^B 就表现了结果的合理性。

  • 1^1 = 0 两个人同时中奖,不存在的~
  • 0^0 = 0 两个人都不中奖
  • 1^0 = 1 A 中奖了,B 没中
  • 0^1 = 1 A 没中奖,B 中奖了

不知道这样子,有没有清楚一点呢?

更普遍的情况

任意一个数和自己异或的结果一定是 0:​​x^x=0​​,

任意一个数和 0 异或的结果,一定是他本身:​​x^0=x​​。

那么再拓展到多个数字的运算。

应用:

LC 137

找重复数字:

不停的和 0 去做异或运算,

class Solution:
def singleNumber2(self, nums):
res = 0
for i in nums:
res ^= i
return res

LC 461

计算哈明距离:

哈明距离可以应用在计算字符串的相似度上。通过 wordEncoding 把句子编码成一串数字的序列。对应相同的位置,有多少值不同,哈明距离就是多少。把“你好啊”,这句话转成:​​[0,1,1,0,1,34]​​​,另一句话是“中午吃啥啊”,转成编码:​​[5,3,2,7,78,3,32,44,1,34]​​。

class Solution {
public int hammingDistance(int x, int y) {
int k = Integer.bitCount(x ^ y);
return k;
}
}