最近在看 <<redis 设计与实现>> 里面讲到了几种 二进制位统计算法,在此做个记录
1. 遍历二进制位
def count_bit(num):
count = 0
while num:
count += num & 1
num >>= 1
return count
遍历统计需要 O(N) 的时间复杂度,N为二进制的长度,总共需要做 N * (右移 + & + 加法) 次操作
对于一个100MB的二进制数,需要800万次上述运算才能得到结果(1000000 * 8)
2. 查表
table = {
int("00000000", 2): 0,
int("00000001", 2): 1,
int("00000011", 2): 2,
int("00000111", 2): 3,
...
}
def count_bit(num):
return table[num]
查表的时间复杂度为 O(1),但是空间复杂度为 O(2^N), N 为二进制的长度
3. SWAR 算法
def count_bit(num):
num = (num & 0x55555555) + ((num >> 1) & 0x55555555)
num = (num & 0x33333333) + ((num >&g