当前位置: 首页 > 后端技术 > Python

Python位运算符【详解】

时间:2023-03-26 00:08:00 Python

位运算是一个你可能比较陌生的概念。在一般的数学运算中看不到类似的概念,所以这节课的内容有点抽象,但是在python应用层开发中用到位运算的并不多,一般都与底层开发。所谓位运算,是指计算机根据内存中数据的二进制位进行的运算。Python按位运算符(www.wakey.com.cn/document-seat.html)只能用于整数类型的运算,是按照整数在??内存中的二进制形式进行计算的。如果本章内容不明白,可以直接跳过。1.按位运算符2.&按位与运算符按位与运算符&的运算规则是:只有当&运算涉及的两位都为1时,结果为1,否则为0。例如1&1为1,0&0就是0,1&0也是0,和逻辑运算符&&很相似。表2Python&OperatorRules例如,9&5可以转化为如下操作:00000000--00000000--00000000--00001001(9存入内存)&00000000--00000000--00000000--00000101(内存中存储5个)00000000--00000000--00000000--00000001(内存中存储1个)&运算符将参与运算的两个整数的所有二进制位都参与运算perform&operation,9&5的结果为1。再比如-9&5可以转化为如下操作:11111111--11111111--11111111--11110111(-9存入内存)&00000000--00000000--00000000--00000101(5存入内存)00000000--00000000--00000000--00000101(5存入内存)-9&5的结果为5。不明白整数在内存中是如何存储的读者请扫一扫:整数在内存中是如何存储的,为什么是天才设计?同样,&运算符对存储在内存中的数据的原始二进制位进行操作,而不是对数据本身的二进制形式进行操作;其他位运算符也是如此。以-9&5为例,-9在内存中的存储与-9的二进制形式完全不同:11111111--11111111--11111111--11110111(-9在内存中存储)-00000000--00000000--00000000--00001001(-9的二进制形式,前面多余的0可以擦除)按位与运算通常用于将某些位清0,或保留某些位。例如n的高16位清0,低16位保留,可以执行n&0XFFFF操作(0XFFFF在内存中的存储形式为00000000--00000000--11111111--11111111).用Python代码验证以上分析:n=0X8FA6002Dprint("%X"%(9&5))print("%X"%(-9&5))print("%X"%(n&0XFFFF))运行结果:152D3.|按位或运算符按位或运算符的运算规则|就是:两个二进制位中有一个为1时,结果为1,都为0时,结果为0。例如1|1为1,0|0为0,1|0为1,这与||非常相似在逻辑运算中。第一个Bit和第二个Bit的结果是000011101111例如9|5可以转化为如下操作:00000000--00000000--00000000--00001001(9inmemorystorageinmemory)|00000000--00000000--00000000--00000101(内存中存储5个)00000000--00000000--00000000--00001101(内存中存储13个)9|5的结果为13。再比如,-9|5可以转化为如下操作:11111111--11111111--11111111--11110111(-9存入内存)|00000000--00000000--00000000--00000101(5存入内存)11111111--11111111--11111111--11110111(-9存入内存)-9的结果|5是-9。按位或运算可用于将某些位设置为1,或保留某些位。例如,将n的高16位设置为1,低16位保持不变,可以执行n|0XFFFF0000操作(0XFFFF0000在内存中的存储形式为11111111--11111111--00000000--00000000)。使用Python代码验证以上分析:n=0X2Dprint("%X"%(9|5))print("%X"%(-9|5))print("%X"%(n|0XFFFF0000))运行结果:D-9FFFF002D4.^按位异或运算按位异或运算^的运算规则是:参与运算的两个二进制位不同时,结果为1,相同时,结果为0.例如0^1为1,0^0为0,1^1为0.第一个Bit和第二个Bit的结果为000011101110例如9^5可以是转换成如下操作:00000000--00000000--00000000--00001001(内存中存储9)^00000000--00000000--00000000--00000101(内存中存储5)00000000--00000000--00000000--00001100(内存中存储12)9^5结果为12。再比如,-9^5可以转化为如下操作:11111111--11111111--11111111--11110111(-9存入内存)^00000000--00000000--00000000--00000101(5存入内存)11111111--11111111--11111111--11110010(-14存入内存)-9^5的结果为-14。按位异或运算可用于反转某些二进制位。例如将n的高16位取反,保留低16位,可以执行n^0XFFFF0000操作(0XFFFF0000在内存中的存储形式为11111111--11111111--00000000--00000000)。使用Python代码验证以上分析:n=0X0A07002Dprint("%X"%(9^5))print("%X"%(-9^5))print("%X"%(n^0XFFFF0000))运行结果:C-EF5F8002D5.~按位取反运算符按位取反运算符~是一元运算符(只有一个操作数),右结合,其作用是将运算中涉及的二进制位取反。比如~1就是0,~0就是1,和!很像。在逻辑运算中。例如~9可以转化为如下操作:~00000000--00000000--00000000--00001001(9存入内存)11111111--11111111--11111111--11110110(-10在内存中)所以~9结果为-10。例如~-9可以转化为如下操作:~11111111--11111111--11111111--11110111(-9存入内存)00000000--00000000--00000000--00001000(内存中存储8)所以~-9结果为8。用Python代码验证上面的分析:print("%X"%(~9))print("%X"%(~-9))运行结果:-A8六、<<左移运算符Python左移运算符<<用于将操作数的所有二进制位左移若干位,舍去高位,低位补0。<<00000000--00000000--00000000--00001001(9存储在内存中)00000000--00000000--00000000--01001000(72存储在内存中)所以9<<3的结果是72,再比如(-9)<<3可以是转换成如下操作:<<11111111--11111111--11111111--11110111(-9存入内存)11111111--11111111--11111111--10111000(-72存入内存)所以(-9)<<3的结果是-72如果数据很小,丢弃的高位不包含1,那么左移n位相当于乘以2的n次方。用Python代码验证以上分析:print("%X"%(9<<3))print("%X"%((-9)<<3))运行结果:48-48VII.>>右移运算符Python右移运算符>>用于将操作数的所有二进制位右移若干位,舍弃低位,高位补0或1。如果数据的最高位为0,则加0;如果最高位为1,则加1。例如9>>3可以转化为如下操作:00000000--00000000--00000000--00001001(9存入内存)00000000--00000000--00000000--00000001(1存储在内存中)所以9>>3结果为1。再比如,(-9)>>3可以转化为如下操作:11111111--11111111--11111111--11110111(-9存入内存)11111111--11111111--11111111--11111110(内存中存储-2)so(-9)>>3结果为-2如果丢弃的低位不包含1,则右移n位相当于除以2的n次方(但是删除的位通常包含1)。用Python代码验证以上分析:print("%X"%(9>>3))print("%X"%((-9)>>3))运行结果:1-2