异或也叫半加运算,其运算法则相当于不带进位的二进制加法
0^1=1
1^0=1
0^0=0
1^1=0
简单来说,异或可以看成相同为1,不同为0
应用1:
变量交换(不用新增临时变量)
a = 132084
b = 749
a = a ^ b # a=a^b b=b
b = a ^ b # a=a^b b=a
a = a ^ b # a=b b=b
print(a)
print(b)
当然python的变量交换有更简单的方式(如下所示),此处仅展示示例
a, b = b, a
原理:
1、0^N=N
2、N^N=0
3、a^b^c=a^(b^c) 即计算先后顺序不影响
应用2:
题目1:多个元素的数组,其中只有1个元素有奇数个,其余元素均为偶数个,请找到奇数个的元素
def find_ele():
int_list = [2, 4, 6, 5, 6, 2, 5, 5, 8, 5, 8]
eor = 0
for ele in int_list:
eor ^= ele
print(eor)
所有元素异或后,得到奇数个的元素
题目2:多个元素的数组,其中只有2个元素有奇数个,其余元素均为偶数个,请找到奇数个的元素
def find_ele2():
int_list = [2, 4, 6, 5, 6, 2, 5, 5, 8, 5, 8, 9]
eor = 0
for ele in int_list:
eor ^= ele
# eor= a ^ b
# eor != 0
# eor必然有一位不为0,找到该位置,并将所有元素按照该位分为两类,一类为0,一类为1
right_one = eor & (~eor + 1) # 提取出最右侧的1
one = 0
for ele in int_list:
if ele & right_one == 1:
one ^= ele
another = eor ^ one
print(one, another)