Python按位运算符

时间:2020-02-23 14:42:27  来源:igfitidea点击:

Python按位运算符用于对整数执行按位计算。
整数转换为二进制格式,然后逐位执行运算,因此命名为按位运算符。

Python按位运算符仅适用于整数,并且最终输出以十进制格式返回。
Python按位运算符也称为二进制运算符。

Python按位运算符

Python中有6个按位运算符。
下表提供了有关它们的简短详细信息。

Bitwise OperatorDescriptionSimple Example
&Bitwise AND Operator10 & 7 = 2
Bitwise OR Operator
^Bitwise XOR Operator10 ^ 7 = 13
~Bitwise Ones' Compliment Operator~10 = -11
<<Bitwise Left Shift operator10<<2 = 40
>>Bitwise Right Shift Operator10>>1 = 5

让我们逐一研究这些运算符,并了解它们的工作方式。

1.按位与运算符

如果两个位均为1,Python按位运算符将返回1,否则返回0。

>>> 10&7
2
>>>

2.按位或者运算符

如果任意位为1,Python按位或者运算符将返回1。
如果两个位均为0,则它将返回0。

>>> 10|7
15
>>>

3.按位XOR运算符

如果位之一为0,另一位为1,则Python按位XOR运算符返回1。
如果两个位均为0或者1,则返回0。

>>> 10^7
13
>>>

4.按位补码运算符

Python Ones补码数字" A"等于-(A + 1)。

>>> ~10
-11
>>> ~-10
9
>>>

5.按位左移运算符

Python按位左移运算符将右操作数中的给定的次数向左移动左操作数位。
简而言之,二进制数字在末尾附加0。

>>> 10 << 2
40
>>>

6.按位右移运算符

Python的右移运算符与左移运算符完全相反。
然后将左侧操作数位向右侧移动给定的次数。
简单来说,右侧位已删除。

>>> 10 >> 2
2
>>>

Python按位运算符重载

Python支持运算符重载。
我们可以实现多种方法来支持自定义对象的按位运算符。

Bitwise OperatorMethod to Implement
&and(self, other)
^xor(self, other)
~invert(self)
<<lshift(self, other)
>>rshift(self, other)

这是我们的自定义对象按位运算符重载的示例。

class Data:
  id = 0

  def __init__(self, i):
      self.id = i

  def __and__(self, other):
      print('Bitwise AND operator overloaded')
      if isinstance(other, Data):
          return Data(self.id & other.id)
      else:
          raise ValueError('Argument must be object of Data')

  def __or__(self, other):
      print('Bitwise OR operator overloaded')
      if isinstance(other, Data):
          return Data(self.id | other.id)
      else:
          raise ValueError('Argument must be object of Data')

  def __xor__(self, other):
      print('Bitwise XOR operator overloaded')
      if isinstance(other, Data):
          return Data(self.id ^ other.id)
      else:
          raise ValueError('Argument must be object of Data')

  def __lshift__(self, other):
      print('Bitwise Left Shift operator overloaded')
      if isinstance(other, int):
          return Data(self.id << other)
      else:
          raise ValueError('Argument must be integer')

  def __rshift__(self, other):
      print('Bitwise Right Shift operator overloaded')
      if isinstance(other, int):
          return Data(self.id >> other)
      else:
          raise ValueError('Argument must be integer')

  def __invert__(self):
      print('Bitwise Ones Complement operator overloaded')
      return Data(~self.id)

  def __str__(self):
      return f'Data[{self.id}]'

d1 = Data(10)
d2 = Data(7)

print(f'd1&d2 = {d1&d2}')
print(f'd1|d2 = {d1|d2}')
print(f'd1^d2 = {d1^d2}')
print(f'd1<<2 = {d1<<2}')
print(f'd1>>2 = {d1>>2}')
print(f'~d1 = {~d1}')

输出:

Bitwise AND operator overloaded
d1&d2 = Data[2]
Bitwise OR operator overloaded
d1|d2 = Data[15]
Bitwise XOR operator overloaded
d1^d2 = Data[13]
Bitwise Left Shift operator overloaded
d1<<2 = Data[40]
Bitwise Right Shift operator overloaded
d1>>2 = Data[2]
Bitwise Ones Complement operator overloaded
~d1 = Data[-11]