位运算(bitwise)是一束魔法钥匙,帮你打开数据最底层的抽屉。本指南系统梳理 Python 中的二进制到掩码,再到信息隐藏全链路技巧,给 2025 年的开发者一份硬核又易懂的手册。
写在前面:为什么你值得学位运算
不论做压缩、加密,还是用树莓派控制外设,只要你需要直接和 0、1 辰对辰对话的场景,位运算都是性能最优、代码最简洁的解决思路。
👉 一篇文章吃透 Python 位运算底层细节与实战
位运算符总览与语法
Python 提供的 6 个原生位运算符号一览:
&位与 AND|位或 OR^位异或 XOR~位非 NOT<<左移>>右移
所有二进制运算符都配备复合赋值版本,如 &=, |=, <<=,完成就地更新。
二进制小白也能懂的 5 分钟速成
- 为什么是二进制?:电子元件只能用「高/低」两种电平,二进制天然抗噪、功耗低。
- 位权体系:以
1101₂为例,1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 13₁₀。 - 编码桥梁:电脑把文本、像素、声音统统先量化为整数,再转为二进制。
你在 Python 里用bin(13)即可秒看对应位串。
逻辑级位运算
下面把位操作想象成一排灯开关:
1. 位与 AND(&)
仅当两盏灯同时亮,结果才亮,相当于交集。
示例:46 & 11 → 00101110 & 00001011 = 00001010 = 10
2. 位或 OR(|)
一盏灯亮就足够,相当于并集。
示例:46 | 11 = 47
3. 位异或 XOR(^)
恋爱版开关:状态必须不同才亮。
特性:同级 XOR 两次即可还原原始值,常用于简单对称加密。
4. 位非 NOT(~)
全部取反。注意:Python 的整数带符号,所以 ~x ≠ 二进制字面意义,~x ≈ -x - 1。
FAQ 1:为什么 NOT 后的值是负数?
因为 Python 内部采用无限精度 + 符号–数值表示,导致看起来不符合直觉。可再用 & 0xFF 等掩码重新限定宽度。
位移运算:左右滑动的魔法
左移(<<)
乘以 2ⁿ。例:39 << 2 = 39 * 4 = 156,但高位溢出到普通整数里将被保留。
右移(>>)
整除 2ⁿ。例:157 >> 3 = 19,自动向下取整。
👉 高并发程序常用手法:位移加速乘除
FAQ 2:算术右移 vs 逻辑右移
- 算术:保留符号位(Python 唯一内置)。
- 逻辑:高位永远补 0,Python 需借助
ctypes模拟。
位掩码(Bitmask):剪贴板般的精细控制
通过单字节掩码可完成以下四板斧:
- 取位:
(value >> n) & 1 - 置位:
value | (1 << n) - 清位:
value & ~(1 << n) - 反转:
value ^ (1 << n)
示例场景:把 8 个布尔状态塞进 1 字节,极大降低内存。
数字在 Python 中的真身
- 小整数(-5~256):提前缓存,身份复用。
- 常规整数:若能在 64 位 long 内则走 C 级别,外面则晋升大整数(PyLong,近乎无限位)。
- 位运算时:负数会被临时转成二进制补码、运算后再变回符号–数值,由此保证跨平台一致。
FAQ 3:如何看 float 的 64 位真值?
import struct
bits = format(struct.unpack('!Q', struct.pack('!d', 3.14))[0], '064b')
print(bits) # 带你直击 IEEE 754 双精度字节序与网络字节序
- Big-endian:高位在前(网络默认)。
- Little-endian:低位在前(x86 等 PC)。
用struct.pack的>,<前缀即刻调序,!一键网络序。
实战彩蛋:把秘密藏进图片(LSB 隐写)
思路:把文件以二进制流读入,然后替换像素 R-G-B 的最低位。肉眼绝对看不出差异。
- 准备一张 24 位 BMP,无压缩。
- 每 3 bytes 像素存 3 bits,连续 8 像素即可藏匿 1 byte。
- 解码端只要反向抽取最低位即可。
代码示例:利用mmap把大图片映射到内存,直接切片读改,一个不落地存回去。
FAQ 4:能藏多少数据?
隐藏量 ≈ 总像素数 ÷ 8(如果只动 1 bit)。若想再快,可动 2~4 位,但噪声肉眼可见风险提高。
FAQ 5:如何防止误杀?
在文件头前加 魔数 + 原始长度,解码时先校验,再写入磁盘。
运算符重载:让位运算飞翔在自定义类型
只要实现下列魔法方法,使类支持位运算: __and__, __or__, __xor__, __invert__, __lshift__, __rshift__ 及其反向 & 就地版本。
例:有序列容器用 << 做 prepend, >> 做 append,语法糖满满。
高性能调优与避坑指南
- Python 3 已帮你完成常量折叠,别用手动位移替代乘法秀微操,效果有可能更小。
- 负值的掩码小心溢出:建议强制
& 0xFF/& 0xFFFFFFFF一次。 - 不要把位运算当布尔短路逻辑:
a & b实际会全算完,不短路。
结语:迈向底层艺术的最后一公里
你已掌握:二进制底子、六大基础运算符、位移机制、掩码技巧、字节序转换、重载手法、隐写实战。下一步:
📂 挖出示例仓库源码,在 BMP 里寻找隐藏的彩蛋!
继续码字不如打包源码动手跑一遍,此刻就把位运算加入你的工具箱,让任何数据都在比特面前俯首称臣。