二进制位统计算法(swar)

最近在看 <<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
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值