求二进制数中1的个数

zxmxhxcc 2011-08-27 09:10:56
以下是网上的两个算法 表示不明白~满地打滚~求指导啊~

以32位无符号整型为例。

1: int Count(unsigned x) {
2: x = x - ((x >> 1) & 0x55555555);
3: x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
4: x = (x + (x >> 4)) & 0x0F0F0F0F;
5: x = x + (x >> 8);
6: x = x + (x >> 16);
7: return x & 0x0000003F;
8: }

这里用的是二分法,两两一组相加,之后四个四个一组相加,接着八个八个,最后就得到各位之和了。

还有一个更巧妙的HAKMEM算法

1: int Count(unsigned x) {
2: unsigned n;
3:
4: n = (x >> 1) & 033333333333;
5: x = x - n;
6: n = (n >> 1) & 033333333333;
7: x = x - n;
8: x = (x + (x >> 3)) & 030707070707;
9: x = modu(x, 63);
10: return x;
11: }

首先是将二进制各位三个一组,求出每组中1的个数,然后相邻两组归并,得到六个一组的1的个数,最后很巧妙的用除63取余得到了结果。

因为2^6 = 64,也就是说 x_0 + x_1 * 64 + x_2 * 64 * 64 = x_0 + x_1 + x_2 (mod 63),这里的等号表示同余。
...全文
287 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxmxhxcc 2011-10-04
  • 打赏
  • 举报
回复
好吧
一个二进制的两位数
ab - 0a得到的数时ab中1的个数~
power721 2011-09-08
  • 打赏
  • 举报
回复
http://www.matrix67.com/blog/archives/264
cnmhx 2011-09-07
  • 打赏
  • 举报
回复
不能直接使用位运算吗?
超级大笨狼 2011-09-05
  • 打赏
  • 举报
回复
Mark
孤独小剑 2011-08-28
  • 打赏
  • 举报
回复
貌似还有个方法,是一个面试题问是什么功能,核心代码如下:

int count = 0;
while(x){
x = x & (x-1);
++count;
}

coding_life5 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coding_life5 的回复:]
这题编程之美上面有
你上面的解法出自:http://blog.csdn.net/justpub/article/details/2292823
参考请看:http://en.wikipedia.org/wiki/Hamming_weight,以及SSE 4.2中的POPCNT指令
[/Quote]

http://en.wikipedia.org/wiki/SSE4#SSE4.2
coding_life5 2011-08-28
  • 打赏
  • 举报
回复
这题编程之美上面有
你上面的解法出自:http://blog.csdn.net/justpub/article/details/2292823
参考请看:http://en.wikipedia.org/wiki/Hamming_weight,以及SSE 4.2中的POPCNT指令

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧