1. 项目背景与问题场景
上周review同事代码时发现一个有趣的现象:原本需要3秒执行的统计函数,被改成位运算后直接降到300毫秒内。这种性能优化手段在数据处理密集型场景特别实用,今天我们就来拆解这个"魔法"背后的原理。
在实际开发中,经常会遇到这样的场景:需要快速判断一个数是否是2的幂次方,或是需要高效计算两个集合的交集。这类操作如果采用常规的算术运算或集合操作,往往会产生不必要的性能开销。而位运算中的与运算(AND),就像是一把瑞士军刀,能以接近硬件层面的效率解决这些问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 位运算基础回顾
2.1 与运算的核心特性
与运算(&)的规则非常简单:两个位都为1时结果才为1,否则为0。这个看似简单的特性却蕴含着强大的能力:
python复制# 基本与运算示例
0b1100 & 0b1010 = 0b1000 # 十进制 12 & 10 = 8
2.2 与运算的三大实用特性
-
清零特性:任何位与0相与都会被清零
python复制x & 0 = 0 # 所有位清零 -
保留特性:任何位与1相与会保留原值
python复制x & 1 = x # 保留最后一位 -
奇偶判断:
x & 1可以快速判断奇偶python复制5 & 1 = 1 # 奇数 6 & 1 = 0 # 偶数
3. 实战优化案例解析
3.1 案例一:判断2的幂次方
原始实现:
python复制def is_power_of_two(n):
if n <= 0:
return False
while n % 2 == 0:
n = n / 2
return n == 1
位运算优化版:
python复制def is_power_of_two(n):
return n > 0 and (n & (n - 1)) == 0
原理分析:
2的幂次方的二进制表示只有一个1(如8=1000)。当n-1时,所有低位变为1(7=0111)。两者相与结果必为0。
性能对比:测试10
