Python - 位运算符


Python 的按位运算符通常与整数类型对象一起使用。然而,它不是将对象视为一个整体,而是将其视为一串位。对字符串中的每一位进行不同的操作。

Python 有六个按位运算符 - &、|、^、~、<< 和 >>。所有这些运算符(除了~)本质上都是二元的,因为它们对两个操作数进行操作。每个操作数都是一个二进制数字(位)1 或 0。

Python - 按位与运算符 (&)

按位 AND 运算符有点类似于逻辑与运算符。仅当两个位操作数均为 1(即 True)时,它才返回 True。所有组合是 -

0 & 0 就是 0
1 & 0 是 0
0和1是0
1 & 1 是 1

当您使用整数作为操作数时,两者都会转换为等效的二进制数,& 运算是对每个数字的相应位进行的,从最低有效位开始到最高有效位。

让我们取两个整数 60 和 13,并将它们分别分配给变量 a 和 b。

a=60
b=13
print ("a:",a, "b:",b, "a&b:",a&b)

它将产生以下输出-

a: 60 b: 13 a&b: 12

要了解 Python 如何执行该操作,请获取每个变量的二进制等效值。

print ("a:", bin(a))
print ("b:", bin(b))

它将产生以下输出-

a: 0b111100
b: 0b1101

为了方便起见,每个数字都采用标准的8位格式,这样“a”为00111100,“b”为00001101。让我们手动对这两个数字的每一个对应位进行操作。

0011 1100
&
0000 1101
-------------
0000 1100

将结果二进制转换回整数。您将得到 12,这是之前获得的结果。

>>> int('00001100',2)
12

Python - 按位或运算符 (|)

“|” 符号(称为管道)是按位或运算符。如果任何位操作数为 1,则结果为 1,否则为 0。

0 | 0就是0
0 | 1 就是 1
1 | 0 是 1
1 | 1 就是 1

取相同的值a=60,b=13。“|” 运算结果为61。获取它们的二进制等价物。

a=60
b=13
print ("a:",a, "b:",b, "a|b:",a|b)
print ("a:", bin(a))
print ("b:", bin(b))

它将产生以下输出-

a: 60 b: 13 a|b: 61
a: 0b111100
b: 0b1101

执行“|” 手动操作,使用8位格式。

0011 1100
    |
0000 1101
-------------
0011 1101

将二进制数转换回整数以计算结果 -

>>> int('00111101',2)
61

Python - 二元异或运算符 (^)

术语 XOR 代表异或。意思是,如果只有一位为 1,则两位的 OR 运算结果将为 1。

0 ^ 0 is 0
0 ^ 1 is 1
1 ^ 0 is 1
1 ^ 1 is 0

让我们对a=60和b=13进行异或运算。

a=60
b=13
print ("a:",a, "b:",b, "a^b:",a^b)

它将产生以下输出-

a: 60 b: 13 a^b: 49

我们现在手动执行按位异或。

0011 1100
    ^
0000 1101
-------------
0011 0001

int() 函数显示 00110001 为 49。

>>> int('00110001',2)
49

Python - 二元非运算符 (~)

该运算符是逻辑 NOT 运算符的二进制等价物。它翻转每一位,使 1 被 0 替换,0 被 1 替换,并返回原始数字的补码。Python使用2的补码方法。对于正整数,只需将位反转即可获得。对于负数 -x,使用 (x-1) 的位模式写入,其中所有位都补码(从 1 切换到 0 或从 0 切换到 1)。因此:(对于 8 位表示)

-1 is complement(1 - 1) = complement(0) = "11111111"
-10 is complement(10 - 1) = complement(9) = complement("00001001") = "11110110".

对于 a=60,它的补码是 -

a=60
print ("a:",a, "~a:", ~a)

它将产生以下输出-

a: 60 ~a: -61

Python - 左移运算符 (<<)

左移运算符将最高有效位向右移动“<<”符号右侧的数字。因此,“x << 2”导致 的二进制表示的两位向右。让我们对 60 进行左移。

a=60
print ("a:",a, "a<<2:", a<<2)

它将产生以下输出-

a: 60 a<<2: 240

这是如何发生的?让我们使用相当于 60 的二进制,并执行左移 2。

0011 1100
<<
    2
-------------
1111 0000

将二进制转换为整数。是240。

>>> int('11110000',2)
240

Python - 右移运算符 (>>)

右移运算符将最低有效位向左移动“>>”符号右侧的数字。因此,“x >> 2”导致 的二进制表示的两位向左移动。让我们对 60 进行右移。

a=60
print ("a:",a, "a>>2:", a>>2)

它将产生以下输出-

a: 60 a>>2: 15

60 上的手动右移操作如下所示 -

   0011 1100
   >>
   2
   -------------
   0000 1111

使用int()函数将上面的二进制数转换为整数。现在是 15。

>>> int('00001111',2)
15