Python位运算符

在Python中,按位运算符用于对整数执行按位计算。首先将整数转换为二进制,然后对每个位或相应的位对执行运算,因此称为按位运算符。然后结果以十进制格式返回。

Python位运算符

运算符   名称描述用法
&按位与如果两个操作数位均为 1,则结果位 1;否则结果位 0。x & y
|按位或如果任何操作数位为 1,则结果位 1;否则结果位 0。x | y
按位取反将一个数的每一位取反(0变为1,1变为0)〜x
^按位异或如果任一操作数位为 1 但不是两者都为 1,则结果为 1,否则 结果位 0。x ^ y
>>右移位向右移动指定的位数。
<<左移位向左移动指定的位数。

按位与运算符

如果两个位都为 1,则返回 1,否则返回 0。

例子:

a = 10 = 1010(二进制)
b = 4 = 0100(二进制)

a & b = 1010
         &
        0100
      = 0000
      = 0(十进制)

按位或运算符

例子:

a = 10 = 1010(二进制)
b = 4 = 0100(二进制)

一个 | b = 1010
         |
        0100
      = 1110
      = 14(十进制)

按位取反运算符

例子:

# 原始整数
a = 5  # 二进制表示为 0101

# 按位取反运算
result_not_a = ~a

# 打印结果
print("原始整数 a 的二进制表示:{:08b}".format(a))  # 08b 表示打印成8位二进制格式
print("按位取反后的二进制表示:{:08b}".format(result_not_a))
print("按位取反后的十进制值:", result_not_a)

输出:

原始整数 a 的二进制表示:00000101
按位取反后的二进制表示:11111010
按位取反后的十进制值: -6

按位异或运算符

将两个数的每一位进行异或操作。如果两个相应位不相同(一个为1,一个为0),则结果为1,否则为0。

a = 10 = 1010(二进制)
b = 4 = 0100(二进制)

a^b = 1010
         ^
        0100
      = 1110
      = 14(十进制)
# Python程序演示
# 位运算符

a = 10
b = 4

# 打印按位与操作结果
print("a & b =", a & b)

# 打印按位或操作结果
print("a | b =", a | b)

# 打印按位取反操作结果
print("~a =", ~a)

# 打印按位异或操作结果
print("a ^ b =", a ^ b)

输出:

a & b = 0
a | b = 14
~a = -11
a ^ b = 14

右移位运算符

将一个数的二进制表示向右移动指定的位数。在右侧添加零或者根据符号位添加1,并丢弃最右边的位。

例子:

示例1:
a = 10 = 0000 1010(二进制)
一>> 1 = 0000 0101 = 5

示例2:
a = -10 = 1111 0110(二进制)
a >> 1 = 1111 1011 = -5

左移位运算符

将一个数的二进制表示向左移动指定的位数。在左侧添加零,并丢弃最左边的位。

例子:

示例1:
a = 5 = 0000 0101(二进制)
a << 1 = 0000 1010 = 10
a << 2 = 0001 0100 = 20

示例2:
b = -10 = 1111 0110(二进制)
b << 1 = 1110 1100 = -20
b << 2 = 1101 1000 = -40
# Python程序演示
# 移位运算符

a = 10
b = -10

# 打印位右移操作结果
print("a >> 1 =", a >> 1)
print("b >> 1 =", b >> 1)

a = 5
b = -10

# 打印位左移操作结果
print("a << 1 =", a << 1)
print("b << 1 =", b << 1)

输出:

a >> 1 = 5
b >> 1 = -5
a << 1 = 10
b << 1 = -20

按位运算符重载

在 Python 中,你不能直接重载位运算符(如 &|^<<>>)来定义自定义对象的位运算行为。这是因为 Python 中的位运算符是内置运算符,不能像一些其他操作符(如算术运算符和比较运算符)一样通过运算符重载方法来自定义。

但是,你可以为自定义对象定义特殊方法(通常是双下划线方法),以模拟位运算的行为。以下是一些用于模拟位运算的特殊方法:

  1. __and__:用于模拟位与操作。
  2. __or__:用于模拟位或操作。
  3. __xor__:用于模拟位异或操作。
  4. __invert__:用于模拟位取反操作。
  5. __lshift__:用于模拟左移位操作。
  6. __rshift__:用于模拟右移位操作。

下面是按位运算符重载的简单示例。

class Geek():
    # ... (类的构造函数和其他方法)

    def __and__(self, obj):
        print("按位与运算符重载")
        if isinstance(obj, Geek):
            return self.value & obj.value
        else:
            raise ValueError("必须是 Geek 类的对象")

    def __or__(self, obj):
        print("按位或运算符重载")
        if isinstance(obj, Geek):
            return self.value | obj.value
        else:
            raise ValueError("必须是 Geek 类的对象")

    def __xor__(self, obj):
        print("按位异或运算符重载")
        if isinstance(obj, Geek):
            return self.value ^ obj.value
        else:
            raise ValueError("必须是 Geek 类的对象")

    def __lshift__(self, obj):
        print("左移位运算符重载")
        if isinstance(obj, Geek):
            return self.value << obj.value
        else:
            raise ValueError("必须是 Geek 类的对象")

    def __rshift__(self, obj):
        print("右移位运算符重载")
        if isinstance(obj, Geek):
            return self.value >> obj.value
        else:
            raise ValueError("必须是 Geek 类的对象")

    def __invert__(self):
        print("按位取反运算符重载")
        return ~self.value

# 驱动代码
if __name__ == "__main__":
    a = Geek(10)
    b = Geek(12)
    print(a & b)
    print(a | b)
    print(a ^ b)
    print(a << b)
    print(a >> b)
    print(~a)

输出:

按位与运算符重载
8
按位或运算符重载
14
按位异或运算符重载
8
左移位运算符重载
40960
右移位运算符重载
8
按位取反运算符重载
-11