Python之位运算

在计算机中所有的数都是以二进制的形式存在的,位运算就是直接对整数在计算机中对应的二进制位进行操作。

位运算分为 6 种如下:

按位与 &
按位或 |
按位异或 ^
按位取反 ~
左移运算 <<
右移运算 <<

重点:二进制数在内存中以补码的形式存储!!,因此位运算都是要基于补码进行操作的

原码、反码、补码:https://www.cnblogs.com/Zzbj/p/13621019.html

一、按位与

运算中的两个数,二进制的对应位都为1,则该位的结果为1,否则为0。

a = 40
b = 10
c = a & b
"""
按位与
40 = 010 1000补
10 = 000 1010补
8  = 000 1000补=原
"""
print(c)  # 8

二、按位或

运算中的两个数,二进制的对应位中只要有一个为1时,结果位就为1,否则为0。

a = 40
b = 10
c = a | b
"""
按位或
40 = 010 1000补
10 = 000 1010补
42 = 010 1010补=原
"""
print(c)  # 42

三、按位异或

运算中的两个数,二进制的对应位中当两个对应位相异时,结果为1,否则为0。

a = 40
b = 10
c = a ^ b
"""
按位异或
40 = 010 1000补
10 = 000 1010补
34 = 010 0010补=原
"""
print(c)  # 34

四、按位取反

把二进制数的每个二进制位取反,即把1变为0, 把0变为1。

a = 40
c = ~a
"""
按位取反
注意:
1.由于二进制数在内存中以补码的形式存储,所以我们需要把得到的二进制数转成补码
正数原反补一样,第一个0是符号位。
40补 = 010 1000

2.按位进行取反,把40的补码进行按位取反,得到的也是一个补码
取反[补] = 101 0111

3.取反后的二进制补码转为原码计算数值
但是由于按位取反后变为负数,所以我们需要用负数的补码转换规则:符号位不变,按位取反,末位加一
取反[原] = 110 1001 = -41
"""
print(c)  # -41

五、左移运算

将一个数的各二进制位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。

运算结果式子:

x 为整数
x << n = x * (2ⁿ)  # x 乘以 2的n次方
a = 40
c = a << 2
"""
左移运算
40 = 0010 1000补
 (00)1010 0000补=原 高位丢弃,低位补0
"""
print(c)  # 160

六、右移运算

将一个数的各二进制位全部右移若干位,由">>"右边的数指定移动的位数,低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1。

运算结果式子:

x 为整数
x >> n = x / (2ⁿ)  # x 除以 2的n次方
a = 40   #  40补 = 010 1000
b = -40  # -40补 = 101 1000
c = a >> 2
d = b >> 2
e = a & b
"""
右移运算:低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1
 40 = 010 1000  补
      000 1010(00)补=原=10

-40 = 101 1000 补
      111 0110(00) 补
      100 1010 原 = -10
      
按位与
 40 = 010 1000 补
-40 = 101 1000 补
      000 1000 补=原
"""
print(c)  # 10
print(d)  # -10
print(e)  # 8
原文地址:https://www.cnblogs.com/Zzbj/p/15569825.html