bitcount函数c语言,同事有话说:如何高效的统计出Bitmap中1的个数

今天,我活泼可爱的同事们在群里欢快地讨论着一个问题:如何高效的统计出Bitmap中1的个数?那么问题来了,Bitmap是什么?

Bitmap

A Bitmap or bitset is an array of zeros and ones. A bit in a bitset can be set to either 0 or 1, and each position in the array is referred to as an offset. Operations such as logical AND, OR, XOR, etc. and other bitwise operations are fair game for Bitmaps.

以上摘自文章 REDIS BITMAPS – FAST, EASY, REALTIME METRICS ,发现还是原汁原味的好理解(我自己翻译的都是什么鬼),其实就是一个二进制数组,数组元素只能是0或者1,你可以对位图执行逻辑与、或、异或等位运算。

所以,其实我们可以把问题简化一下:

如何高效的统计出二进制数中1的个数

这个就好理解多了嘛,马上安排。俗话说的好,“没什么好想法的时候,直接暴破”,于是就有了第一种解法:

public static int count(int n) {

int count = 0;

while (n > 0) {

if ((n&1) == 1) { // 计算最低位是不是为1

count++;

}

n >>>= 1; // 无符号右移1位,把最低位挤出去

}

return count;

}

复制代码

这个解法简单又粗暴,时间复杂度为O(N),N就是二进制数字的长度,比如二进制数字100100,N就等于6.于是问题又来了,如果这个二进制数长度很长,比如10000,但是1的数量只有10个,使用第一种解法的话我们需要循环计算10000次,但实际执行count++的操作只有10次,剩余的9990次似乎有些浪费,我们能不能做到1有多少个就循环计算多少遍?于是第二种解法应运而生:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值