Python - 按位运算符



Python 按位运算符

Python 按位运算符(Python Bitwise Operators)通常用于对整数类型对象执行按位运算。但是,它不是将对象视为一个整体,而是将其视为一串位。对字符串中的每个位执行不同的操作。

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

以下是 Python 中的按位运算符 -

  • 按位 AND 运算符
  • 按位 OR 运算符
  • 按位 XOR 运算符
  • 按位 NOT 运算符
  • 按位 左移 运算符
  • 按位 右移 运算符

Python 按位 AND 运算符 (&)

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

0 & 0 is 0
1 & 0 is 0
0 & 1 is 0
1 & 1 is 1

当你使用整数作为操作数时,两者都被转换为等效的二进制,&操作在每个数字的相应位上完成,从最低有效位开始,一直到最高有效位。

Python 按位 AND 运算符示例

让我们取两个整数 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 位格式,以便00111100“a”,00001101“b”。让我们对这两个数字的每个对应位手动执行和操作。

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

将生成的 binary 转换回整数。你会得到 12,这是之前获得的结果。


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

Python 按位 OR 运算符 (|)

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

0 | 0 is 0
0 | 1 is 1
1 | 0 is 1
1 | 1 is 1

Python 按位 OR 运算符示例

取 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 运算符 (^)

术语 XOR 代表排他 OR。这意味着如果只有一个位是 1,则对两个位进行 OR 运算的结果将为 1。


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

Python 按位 XOR 运算符示例

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


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

它将产生以下输出 -

a: 60 b: 13 a^b: 49

现在,我们手动执行按位 XOR。

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

int() 函数显示 00110001 为 49。


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

Python 按位 NOT 运算符 (~)

此运算符是逻辑 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".

Python 按位 NOT 运算符示例

对于 a=60,其补数为 −


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

它将产生以下输出 -

a: 60 ~a: -61

Python 按位左移运算符 (<<)

左移运算符将最高有效位右移 “<<”符号。因此,“x << 2” 会导致 的二进制表示的两位右。

Python 按位左移运算符示例

让我们在 60 上执行左移。


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

它将产生以下输出 -

a: 60 a<<2: 240

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


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

将 binary 转换为 integer。是 240 人。


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

Python 按位右移运算符 (>>)

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

Python 按位右移运算符示例

让我们在 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