在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 中的位运算符是内置运算符,不能像一些其他操作符(如算术运算符和比较运算符)一样通过运算符重载方法来自定义。
但是,你可以为自定义对象定义特殊方法(通常是双下划线方法),以模拟位运算的行为。以下是一些用于模拟位运算的特殊方法:
__and__
:用于模拟位与操作。__or__
:用于模拟位或操作。__xor__
:用于模拟位异或操作。__invert__
:用于模拟位取反操作。__lshift__
:用于模拟左移位操作。__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