Python 位运算权威指北:掌握底层世界的 1 与 0

·

位运算(bitwise)是一束魔法钥匙,帮你打开数据最底层的抽屉。本指南系统梳理 Python 中的二进制到掩码,再到信息隐藏全链路技巧,给 2025 年的开发者一份硬核又易懂的手册。

写在前面:为什么你值得学位运算

不论做压缩、加密,还是用树莓派控制外设,只要你需要直接和 0、1 辰对辰对话的场景,位运算都是性能最优、代码最简洁的解决思路。
👉 一篇文章吃透 Python 位运算底层细节与实战


位运算符总览与语法

Python 提供的 6 个原生位运算符号一览:

所有二进制运算符都配备复合赋值版本,如 &=, |=, <<=,完成就地更新。


二进制小白也能懂的 5 分钟速成

  1. 为什么是二进制?:电子元件只能用「高/低」两种电平,二进制天然抗噪、功耗低。
  2. 位权体系:以 1101₂ 为例,1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 13₁₀
  3. 编码桥梁:电脑把文本、像素、声音统统先量化为整数,再转为二进制。
    你在 Python 里用 bin(13) 即可秒看对应位串。

逻辑级位运算

下面把位操作想象成一排灯开关:

1. 位与 AND(&)

仅当两盏灯同时亮,结果才亮,相当于交集
示例:46 & 1100101110 & 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 逻辑右移


位掩码(Bitmask):剪贴板般的精细控制

通过单字节掩码可完成以下四板斧:

  1. 取位(value >> n) & 1
  2. 置位value | (1 << n)
  3. 清位value & ~(1 << n)
  4. 反转value ^ (1 << n)

示例场景:把 8 个布尔状态塞进 1 字节,极大降低内存。


数字在 Python 中的真身


FAQ 3:如何看 float 的 64 位真值?

import struct
bits = format(struct.unpack('!Q', struct.pack('!d', 3.14))[0], '064b')
print(bits)  # 带你直击 IEEE 754 双精度

字节序与网络字节序


实战彩蛋:把秘密藏进图片(LSB 隐写)

思路:把文件以二进制流读入,然后替换像素 R-G-B 的最低位。肉眼绝对看不出差异。

  1. 准备一张 24 位 BMP,无压缩。
  2. 每 3 bytes 像素存 3 bits,连续 8 像素即可藏匿 1 byte。
  3. 解码端只要反向抽取最低位即可。
    代码示例:利用 mmap 把大图片映射到内存,直接切片读改,一个不落地存回去。

FAQ 4:能藏多少数据?

隐藏量 ≈ 总像素数 ÷ 8(如果只动 1 bit)。若想再快,可动 2~4 位,但噪声肉眼可见风险提高。

FAQ 5:如何防止误杀?

在文件头前加 魔数 + 原始长度,解码时先校验,再写入磁盘。


运算符重载:让位运算飞翔在自定义类型

只要实现下列魔法方法,使类支持位运算:
__and__, __or__, __xor__, __invert__, __lshift__, __rshift__ 及其反向 & 就地版本。
例:有序列容器用 << 做 prepend, >> 做 append,语法糖满满。


高性能调优与避坑指南


结语:迈向底层艺术的最后一公里

你已掌握:二进制底子、六大基础运算符、位移机制、掩码技巧、字节序转换、重载手法、隐写实战。下一步:
📂 挖出示例仓库源码,在 BMP 里寻找隐藏的彩蛋

继续码字不如打包源码动手跑一遍,此刻就把位运算加入你的工具箱,让任何数据都在比特面前俯首称臣。