python位运算符的用法

提示:
python位运算符的用法
位运算符是对于二进制的相关操作
位运算符包括六种:&  |  ^  ~  <<  >>


总览

位运算符
该图来源:W3school
直达运算符相关内容

二进制在python中表示为”0b”。例如 a = 0b100110。bin函数可以把十进制转化为二进制数。

& (与)

AND,如果两个二进制相同位数均为1,则返回的数字的二进制在该位置值也为1,否则为0。

(其中,a = 50, b = 23, a & b = 18,均为int)

| (或)

如果两个二进制相同位数至少有一个1,则返回的数字的二进制在该位置值也为1,否则为0。

(其中,a = 50, b = 23, a | b = 55,均为int)

^ (异或)

如果两个二进制相同位数上的数字不同,则返回的数字的二进制在该位置值为1,否则为0。
在这里插入图片描述
(其中,a = 50, b = 23, a ^b = 37)

异或的性质:

满足交换律,即 a ^ b = b ^ a;
相同两个数异或为0 ,即 a ^ a = 0;
0异或一个数为那个数本身,即 0 ^ a = a。

~ (取反)

将数字转化为二进制后,数字前加一个负号,二进制加1,再返回变换后二进制对应的数。

( 可以理解为 ~a = - (a + 1) )

<<(左移)

将数字转化为二进制后,向二进制末尾里添加几个零,高位不舍弃(取决于左移的位数),再返回变换后二进制对应的数。

a=50 对应二进制(110010)
a<<2
a=11001000(200)

>>(右移)

将数字转化为二进制后,将二进制高位添加几个零,末尾舍弃,要是不舍弃那移动毫无意义(取决于右移的位数),再返回变换后二进制对应的数。
a=50 对应二进制(110010)
a>>2
a=001100(12)

位运符的妙用

判断整数的奇偶性

我们只需要使用&运算,与1进行&,如果为1,那么该数为奇数;如果为0,那么该数是偶数。(注意,1在python中也可以表示True,0为False)

左移一位相当于乘2,右移一位相当于地板除2
这样更清晰明了,并且可提高算法速度(毕竟是运用二进制来进行运算的)!

找数据列表中独一的那个数
有一个数据列表(2N+1个整数),只有一个数出现了1次,其余N个数都出现了2次。如何找到这个独一无二的数据?如果通过计数,建立列表,循环整个数据并计数,然后遍历这个列表找到出现次数为1的数据。这样,空间复杂度为O(N)。

如何降低空间复杂度呢?

注意看一下刚刚讲过的异或的特性:任意数和自身异或结果为0;0和任意数异或结果还是其本身。 那么,出现了2次的N个数异或的结果是0,再与出现次数为1次的数异或的结果即为该数。即:找到这个独一无二数据的办法是通过对全部的数据进行异或操作,空间复杂度降低为O(1)。例如:

list_ = [1,1,2,2,3,3,4,5,5]
res = 0
 
for i in list_ :
    res = res ^ i
 
print(res)

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心灵排骨汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值