异或性质:
a^a = 0
a^a^b = b
必须保证A和B指向的内存是2块
交换变量:
a = a^b
b = a^b
a = a^b
衍生题目:
1. 1组数中只有1个数出现奇数次,其他都是偶数,如何快速找到?
直接全部异或
arr = [1,2,3,1,2,3,1]
res = 0
for i in arr:
res ^= i
print(res)
2. 一个数组一个数组只有一个数出现奇数次,其他都出现了偶数次,求两个数。
从头异或到尾:eor = a^b
a和b也是不相等的
所以eor的结果一定有一位是不等于0的,是为1的
假设第八位为1,a和b在第八位是不相等的
现在我们可以把所有的数分为2类,1类是第八位为1的数,还有一类是第八位为0的数,要找的a和b就分别存在于这2类里。
那么我们再遍历一次,eor' 只异或第八位是1的数,这样得到的结果就是a或者b,例如a
eor = a^b
eor' = a
另外一个数就是 eor ^ eor'
arr = [1,2,3,1,2,3,1,2]
res = 0
res2 = 0
for i in arr:
res ^= i
index = -1
t = res
# 找到异或结果为1的
while t & 1 :
index += 1
t = t >> 1
for i in arr:
if (i >> 1):
continue
else:
res2 ^= i
print(res2)
print(res^res2)