pin_drop当前位置:知识文库 ❯ 图文

Python位运算符

概述

位运算符直接对整数的二进制位进行操作,是底层编程和性能优化的重要工具。虽然日常开发中使用频率不如算术和逻辑运算符,但在加密算法、网络协议、图像处理、嵌入式开发等领域有着不可替代的作用。本节将详细介绍Python中的六种位运算符及其应用场景。


二进制表示

在学习位运算之前,需要先理解二进制表示。Python中可以使用bin()函数查看整数的二进制形式:

代码示例

print(bin(10))
print(bin(255))
print(bin(-10))

输出:

代码示例

0b1010
0b11111111
-0b1010

进制表示

进制 前缀 示例 十进制值
二进制 0b 0b1010 10
八进制 0o 0o12 10
十进制 10 10
十六进制 0x 0xA 10

补码表示

Python中负数使用补码表示。以8位为例:

  • 正数50000 0101

  • 负数-51111 1011(补码)

Python的整数没有固定位数限制,负数的二进制表示以-开头:

代码示例

print(bin(5))
print(bin(-5))

按位与(&)

按位与运算符对两个数的每一位进行与运算,只有两个对应位都为1时结果才为1。

运算规则

位A 位B A & B
0 0 0
0 1 0
1 0 0
1 1 1

示例

代码示例

a = 12
b = 10
print(f"a = {a} ({bin(a)})")
print(f"b = {b} ({bin(b)})")
print(f"a & b = {a & b} ({bin(a & b)})")

输出:

代码示例

a = 12 (0b1100)
b = 10 (0b1010)
a & b = 8 (0b1000)

计算过程:

代码示例

  1100  (12)
& 1010  (10)
------
  1000  (8)

应用:清零和取特定位

代码示例

num = 0b11010110
mask = 0b00001111
lower_4 = num & mask
print(f"低4位: {bin(lower_4)}")

upper_4_mask = 0b11110000
upper_4 = num & upper_4_mask
print(f"高4位(保留): {bin(upper_4)}")

按位或(|)

按位或运算符对两个数的每一位进行或运算,只要有一个对应位为1结果就为1。

运算规则

位A 位B A | B
0 0 0
0 1 1
1 0 1
1 1 1

示例

代码示例

a = 12
b = 10
print(f"a | b = {a | b} ({bin(a | b)})")

输出:

代码示例

a | b = 14 (0b1110)

计算过程:

代码示例

  1100  (12)
| 1010  (10)
------
  1110  (14)

应用:设置标志位

代码示例

READ = 0b0001
WRITE = 0b0010
EXECUTE = 0b0100

permission = READ | WRITE
print(f"读写权限: {bin(permission)}")

permission = permission | EXECUTE
print(f"添加执行权限: {bin(permission)}")

按位异或(^)

按位异或运算符对两个数的每一位进行异或运算,对应位不同时结果为1,相同时为0。

运算规则

位A 位B A ^ B
0 0 0
0 1 1
1 0 1
1 1 0

示例

代码示例

a = 12
b = 10
print(f"a ^ b = {a ^ b} ({bin(a ^ b)})")

输出:

代码示例

a ^ b = 6 (0b0110)

计算过程:

代码示例

  1100  (12)
^ 1010  (10)
------
  0110  (6)

应用:交换变量

代码示例

a = 15
b = 27
print(f"交换前: a={a}, b={b}")

a = a ^ b
b = a ^ b
a = a ^ b
print(f"交换后: a={a}, b={b}")

应用:简单加密

代码示例

key = 123
message = 72

encrypted = message ^ key
print(f"加密后: {encrypted}")

decrypted = encrypted ^ key
print(f"解密后: {decrypted}")

按位取反(~)

按位取反运算符对操作数的每一位取反,0变1,1变0。

运算规则

位A ~A
0 1
1 0

示例

代码示例

a = 10
print(f"~{a} = {~a}")
print(f"~0 = {~0}")
print(f"~-1 = {~-1}")

输出:

代码示例

~10 = -11
~0 = -1
~-1 = 0

取反公式

~x = -(x + 1)

代码示例

for x in [0, 1, 5, 10, 255]:
    print(f"~{x} = {~x}, -({x}+1) = {-(x + 1)}")

左移(<<)

左移运算符将二进制位向左移动指定位数,右侧补0。每左移一位相当于乘以2。

示例

代码示例

a = 5
print(f"{a} << 1 = {a << 1}")
print(f"{a} << 2 = {a << 2}")
print(f"{a} << 3 = {a << 3}")

输出:

代码示例

5 << 1 = 10
5 << 2 = 20
5 << 3 = 40

计算过程:

代码示例

5      = 0000 0101
5 << 1 = 0000 1010  (10)
5 << 2 = 0001 0100  (20)
5 << 3 = 0010 1000  (40)

应用:快速乘以2的幂

代码示例

num = 7
print(f"{num} * 2 = {num << 1}")
print(f"{num} * 4 = {num << 2}")
print(f"{num} * 8 = {num << 3}")
print(f"{num} * 16 = {num << 4}")

右移(>>)

右移运算符将二进制位向右移动指定位数,左侧补符号位。每右移一位相当于除以2(向下取整)。

示例

代码示例

a = 40
print(f"{a} >> 1 = {a >> 1}")
print(f"{a} >> 2 = {a >> 2}")
print(f"{a} >> 3 = {a >> 3}")

输出:

代码示例

40 >> 1 = 20
40 >> 2 = 10
40 >> 3 = 5

计算过程:

代码示例

40      = 0010 1000
40 >> 1 = 0001 0100  (20)
40 >> 2 = 0000 1010  (10)
40 >> 3 = 0000 0101  (5)

负数右移

代码示例

a = -40
print(f"{a} >> 1 = {a >> 1}")
print(f"{a} >> 2 = {a >> 2}")

输出:

代码示例

-40 >> 1 = -20
-40 >> 2 = -10

应用:快速除以2的幂

代码示例

num = 100
print(f"{num} // 2 = {num >> 1}")
print(f"{num} // 4 = {num >> 2}")
print(f"{num} // 8 = {num >> 3}")

运算符表格

运算符 名称 描述 示例 结果
& 按位与 两位都为1则为1 12 & 10 8
| 按位或 有一位为1则为1 12 | 10 14
^ 按位异或 两位不同则为1 12 ^ 10 6
~ 按位取反 各位取反 ~10 -11
<< 左移 各位左移n位 5 << 2 20
>> 右移 各位右移n位 40 >> 2 10

代码示例

示例1:权限管理

代码示例

PERMISSION_READ = 1
PERMISSION_WRITE = 2
PERMISSION_EXECUTE = 4
PERMISSION_ADMIN = 8

user_permission = PERMISSION_READ | PERMISSION_WRITE

if user_permission & PERMISSION_READ:
    print("有读权限")
if user_permission & PERMISSION_WRITE:
    print("有写权限")
if user_permission & PERMISSION_EXECUTE:
    print("有执行权限")
else:
    print("无执行权限")

示例2:判断奇偶

代码示例

def is_even(n):
    return (n & 1) == 0

for i in range(6):
    print(f"{i}: {'偶数' if is_even(i) else '奇数'}")

示例3:颜色操作

代码示例

red = 0xFF0000
green = 0x00FF00
blue = 0x0000FF

yellow = red | green
print(f"黄色: #{yellow:06X}")

r = (yellow & 0xFF0000) >> 16
g = (yellow & 0x00FF00) >> 8
b = yellow & 0x0000FF
print(f"RGB: ({r}, {g}, {b})")

示例4:位运算实现加减

代码示例

def add(a, b):
    while b != 0:
        carry = a & b
        a = a ^ b
        b = carry << 1
    return a

print(f"3 + 5 = {add(3, 5)}")
print(f"15 + 27 = {add(15, 27)}")

注意事项

注意:位运算只适用于整数。对浮点数使用位运算会抛出TypeError

提示:Python整数无溢出。Python整数没有固定位数限制,左移不会溢出,但负数右移需要注意。

提示:取反公式~x = -(x + 1),理解这个公式有助于快速计算取反结果。

提示:位移效率——位运算比乘除法更快,但现代编译器通常会自动优化,不必过度追求位运算。

提示:可读性优先——在大多数场景下,使用算术运算符比位运算符更易读,除非有明确的性能需求或位操作语义。


小结

本节我们学习了:

  • 按位与(&):两位都为1则为1,常用于清零和取特定位

  • 按位或(|):有一位为1则为1,常用于设置标志位

  • 按位异或(^):两位不同则为1,常用于交换变量和加密

  • 按位取反(~):各位取反,~x = -(x + 1)

  • 左移(<<):左移n位相当于乘以2的n次方

  • 右移(>>):右移n位相当于除以2的n次方

位运算符虽然使用频率不如算术运算符,但在特定场景下非常高效和实用,是Python程序员应该掌握的重要工具。


练习题

练习1

编写程序,输入一个整数,使用位运算判断它是否是2的幂次方。(提示:2的幂次方的二进制表示中只有一个1)

练习2

编写程序,输入一个整数,统计其二进制表示中1的个数。例如,13的二进制为1101,有3个1。

常见问题

Python中位运算符可以用于浮点数吗?

不可以。位运算符只适用于整数类型,对浮点数使用位运算会抛出TypeError异常。

为什么~10的结果是-11?

这是由取反公式决定的:~x = -(x + 1)。所以~10 = -(10 + 1) = -11

位运算真的比乘除法快吗?

在底层硬件级别,位运算确实比乘除法更快。但现代编译器和Python解释器通常会自动优化乘除2的幂次的运算,因此在大多数场景下差异不明显。除非有明确的性能需求,否则应优先使用可读性更好的算术运算符。

如何用位运算判断一个数是否是2的幂次方?

如果一个数n是2的幂次方,那么它的二进制表示中只有一个1。利用这个特性,可以用n & (n-1) == 0来判断。例如8的二进制是1000,7的二进制是0111,8&7=0,说明8是2的幂次方。

Python的左移会导致溢出吗?

不会。Python的整数没有固定位数限制,可以自动扩展到任意大小,所以左移操作不会导致溢出。这与C/Java等固定位数整数的语言不同。

标签: 位运算符 Python基础 二进制 按位与 按位或 按位异或 位移运算

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python逻辑运算符 下一篇: Python成员运算符in和not

poll相关推荐

作者头像 智能小晨 python

Python类型转换详解

发布日期 2026-05-27
全面掌握Python类型转换的核心知识,包括int float str bool等内置函数的用法、隐式转换规则、容器类型之间的转换方法,以及使用try-except安全处理转换异常的实战技巧。通过丰富的代码示例,帮助你写出更健壮的Python代码。
作者头像 智能小晨 python

Python字符串类型详解

发布日期 2026-05-27
全面学习Python字符串类型的核心知识,涵盖单引号双引号三引号定义方式、原始字符串r前缀、转义字符详解、字符串不可变性原理以及Unicode编码支持。
作者头像 智能小晨 python

Python布尔类型详解

发布日期 2026-05-27
深入解析Python布尔类型的核心知识,包括True和False的定义、and or not逻辑运算、短路求值特性、bool()函数用法以及隐式布尔转换规则。通过丰富的代码示例,帮助你掌握Python布尔类型的实际应用,写出更优雅的条件判断代码。
作者头像 智能小晨 python

Python复数类型complex详解

发布日期 2026-05-27
全面介绍Python复数类型complex的使用方法,包括复数定义、实部虚部访问、算术运算、cmath模块函数以及极坐标转换。掌握复数在科学计算和工程领域的应用。