原生位操作符最快,因由C实现直通CPU指令,而bin()等字符串方式需构造对象、遍历字符、内存分配,时间复杂度O(log n);实测统计一千万整数二进制1的个数,bin(x).count('1')耗时2.8秒,位运算仅0.45秒。

直接用原生位操作符就是最快的方式,不需要封装、不引入额外抽象、不转字符串——Python 的 &、|、^、、<code>>> 全部由 C 实现,底层直通 CPU 指令。
为什么不用 bin() 或 format() 转字符串再处理
把整数转成 bin() 字符串(如 '0b1010')再切片、计数、替换,本质是构造新对象+遍历字符,时间复杂度 O(log n),还触发内存分配。而 n & 1、n >> 1 是单指令周期操作,常数时间。
- 实测:对一千万个 int 统计二进制中 1 的个数,
bin(x).count('1')耗时约 2.8 秒;while x: count += x & 1; x >>= 1耗时约 0.45 秒 - 字符串方式无法做位级掩码操作(比如只取低 4 位),必须手动切片 + int() 回转,出错率高
-
bin()输出带'0b'前缀,处理前得先 strip,多一步无谓判断
哪些场景下原生位操作符最不能省
真正依赖效率的逻辑,绕不开直接位操作:
-
权限校验:用
user_perms & READ_PERMISSION判断,比READ_PERMISSION in user_perms_list快一个数量级,且支持组合掩码(如READ_PERMISSION | WRITE_PERMISSION) -
硬件寄存器模拟:读写某几位时,必须用
(reg_value & ~MASK) | (new_bits ,字符串完全无法表达“清零再置位”这个原子动作 -
算法内循环:如 Brian Kernighan 算法
n & (n - 1)清除最低位 1,每轮只处理一个 1,比逐位右移快得多(尤其对稀疏 1 的数) -
网络字节序/协议解析:从 bytes 解包字段时,
data[0] & 0x0F提取低 4 位比int(f'{data[0]:08b}'[-4:], 2)稳定且无编码风险
容易被忽略的兼容性与边界问题
原生位操作看似简单,但 Python 的整数无符号限制和负数补码表示会悄悄埋坑:
立即学习“Python免费学习笔记(深入)”;
-
~x不等于-x,而是-(x + 1)(因 Python 用无限精度补码),~5得-6,不是0xFFFFFFFA—— 若需固定宽度掩码(如 32 位),得手动加& 0xFFFFFFFF -
>>对负数是算术右移(高位补 1),不是逻辑右移;要逻辑右移需用(x % 0x100000000) >> n或numpy.uint32(x) >> n -
0b10000000000000000000000000000000这种高位为 1 的字面量,在 Python 中仍是正数(因无位宽限制),但传给 C 扩展或 ctypes 时可能被解释为负,需显式类型转换 - 左移超限不会溢出报错,但会生成极大整数,后续运算变慢;建议在密集位移前用
if n.bit_length() + shift > 64:预判
真正高效的位运算,核心就一条:让数据始终以 int 形态在线,别让它落地成字符串、列表或自定义对象。所有“更高级”的封装,只要多一次函数调用或多一个中间变量,就在吃掉那几纳秒的硬件红利。


















