✨前言:
在Python中,位运算用于直接操纵数值的二进制位。以下是Python中的几种位运算符,每个位运算符的功能及其使用实例:
✨按位与(AND) - &
当两个操作数的位都为1时,结果的相应位才是1,否则是0。
📌例如:
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c = a & b # 12 = 0000 1100
print(c)
✨按位或(OR) - |
只要两个操作数中的一个位是1,结果的相应位就是1。
📌例如:
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c = a | b # 61 = 0011 1101
print(c)
✨按位异或(XOR) - ^
当两个操作数中的位相异时,结果的相应位是1。
📌例如:
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c = a ^ b # 49 = 0011 0001
print(c)
✨按位取反 - ~
计算机内部在做数学运算时(也就是计算机的0和1的运算),都是以补码为标准的,说白了计算机中就一种码那就是补码,而现实社会中的编码规则,例如原码、反码都是我们自定义的,为了和计算机中的补码形成转换关系。所以说在我们手工计算这类由计算机计算的01运算,要站在计算机的角度。因此首先就要将我们的原码反码全都先转为补码,再来计算.
正数的原、反、补码都是它本身;负数的原码最高位为1开头,反码是最高符号位不变,其余位在原码的基础上取反,补码是在反码的基础上+1即可得到.
在Python中按位取反是使用波浪符号 ~ 操作符来完成的。按位取反操作翻转二进制表示中的所有位:将0变为1,将1变为0。
由于Python使用的是补码来表示整数,了解按位取反操作时需要记住以下几点:
对于非负整数,位取反操作的结果是:~x == -(x + 1)
对于负整数,位取反操作的结果是:~x == -(x + 1),其中 x 是负数的原码。
📌例如:
a = 10 # 10的二进制表示: 0000 1010
complement_a = ~a # 按位取反后的值: 1111 0101 (这里的表示是补码)print(complement_a) # 输出: -11
在进行按位取反操作时,结果不是简单地翻转了二进制中的位;事实上,结果是得到了操作数的补码形式。在这个例子中,10的二进制表示是0000 1010(考虑到8位整数,没有考虑符号位),当我们对10进行按位取反时,我们得到一个新的二进制表示1111 0101,这个新的二进制数是-11的补码表示。
为了解释这个结果,这里的关键是理解Python中整数是以补码形式存储的,因此按位取反后得到的实际上是补码表示的反码(即所有位取反),再加上1得到的补码。而由于整数位数不固定,所以实际上是按当前整数所占位数的配额进行取反(不仅仅是8位或32位)。结果是得到与原来的整数相反的数,并且比原来的数小1。
简单来说按位取反符号为~ ,它对于任何数字x的效果可以表示为-x - 1。
✨左移 - <<
把一个数的所有位向左移动指定的位数,右边空出的位用0填充。
📌例如:
a = 60 # 60 = 0011 1100
c = a << 2 # 240 = 1111 0000
print(c)
✨右移 - >>
把一个数的所有位向右移动指定的位数,对于无符号数,左边空出的位用0填充,对于有符号数,根据具体实现可能用符号位填充。
📌例如:
a = 60 # 60 = 0011 1100
c = a >> 2 # 15 = 0000 1111
print(c)
注意:以上给出的二进制形式是为了方便理解,Python会将它存储为数值的补码形式。对于位取反操作,你可能注意到结果不如你预期,因为Python中的整数是以补码形式存储的,并且Python中的整数位数是不固定的(不像C和C++中的32或64位整数),所以按位取反会影响所有的位,包括符号位。