位运算(异或)

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

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值