位运算(异或)

异或也叫半加运算,其运算法则相当于不带进位的二进制加法

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)

你可能感兴趣的:(算法,python)