一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数?

weicai_chen 2007-06-26 10:51:44
加精
如何以最快的速度计算出一个二进制数中1的个数?假设这个二进制数位数可以很长,比如有100位以上或更多。。。

大家说说自己的想法。

...全文
2867 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
const_golenet 2010-09-28
  • 打赏
  • 举报
回复
我来挺挺!!!!!!!!!!1我来挺挺!!!!!!!!!!1
ccm_0 2010-09-23
  • 打赏
  • 举报
回复
学习一下
hehehengha1 2009-10-10
  • 打赏
  • 举报
回复
咋和低位的没啥区别 都是循环移位的??
高手给个意见罗
「已注销」 2007-08-26
  • 打赏
  • 举报
回复
把0替换掉,剩下的长度不就是1的个数么?
DLMU_net 2007-08-22
  • 打赏
  • 举报
回复
mark~
ahjoe 2007-08-19
  • 打赏
  • 举报
回复
按Byte查表, 不只一个字节就循环
NowCan 2007-08-16
  • 打赏
  • 举报
回复
直接相加就够了。
NowCan 2007-08-16
  • 打赏
  • 举报
回复
1000万个0/1输入,每个0/1占一个字节?
==
是啊我也糊涂了,如果这样的话,直接扫描一遍就很快了。
trueytht 2007-08-16
  • 打赏
  • 举报
回复
看来我是没明白原题的意思,该算法的输入是什么呢?
jiangbin00cn 2007-08-15
  • 打赏
  • 举报
回复
1000万的0/1输入
//////////////////////////
这里不明白,计算机内部数据都是以字节为单位的,1000万个0/1输入,每个0/1占一个字节?这样的话是你之前处理的问题,而不是这个算法的问题

个人认为就速度而言造表法最快,不过如果是嵌入式开发两两合并求1的算法最优,关键是能够拓展思路
trueytht 2007-08-13
  • 打赏
  • 举报
回复
问一下具体的实现,现在我知道了32bit的好方法:
void find32One(int n) {

const int MASK1 = 0x55555555;
const int MASK2 = 0x33333333;
const int MASK4 = 0x0f0f0f0f;
const int MASK8 = 0x00ff00ff;
const int MASK16 = 0x0000ffff;

n = (n & MASK1) + ((n >> 1) & MASK1);
n = (n & MASK2) + ((n >> 2) & MASK2);
n = (n & MASK4) + ((n >> 4) & MASK4);
n = (n & MASK8) + ((n >> 8) & MASK8);
n = (n & MASK16) + ((n >> 16) & MASK16);

cout << n << " number of 1." << endl;
}

但是对于长度是1000万的0/1输入,如何实现呢?
如果用string来存储每一个32bit,那效率是不是太低了?
要不然如何去实现呢?所以我觉得这个算法的主要开销在前面,
而不是32bit的.既然主要开销在前面,那应该集中去处理
前面的部分,32bit这里用移位或者n &= (n-1) 就行了.
大家都怎么实现把长串分割的呢?
sankt 2007-07-26
  • 打赏
  • 举报
回复
比较经典的问题了
krfstudio 2007-07-26
  • 打赏
  • 举报
回复
MARK,学到不少东西,呵呵。
whycadi 2007-07-25
  • 打赏
  • 举报
回复
fire_woods(风林火山)的算法不错,两两合并求1的个数的和,虽然32位上优势不大,如果是64位的话就比移位快很多了。比查表省地方多了。
  • 打赏
  • 举报
回复
fire_woods 的方法很好,说细的算法说明可以参看《Hacker's Delight》(中文书名《高效程序的奥秘》)里面有讲解。
settingsun86 2007-07-24
  • 打赏
  • 举报
回复
int GetBits(int number)
{
int retval = 0;

for(; number >0; number/=2)
{
if((number % 2) == 1)
retval ++;
}

return retval;
}
jiangbin00cn 2007-07-24
  • 打赏
  • 举报
回复
int getBits(int number)
{
int retval = 0;

for( ; number; number &= number - 1)
retval++;
return retval;
}

////////////////////////
mark

如果内存宽裕,可以造表,呵呵,我是tablelover,
高效,异读,就是浪费内存。
SoftBomb 2007-07-23
  • 打赏
  • 举报
回复
快速将所有的1都置零,NB
zhuying1983 2007-07-23
  • 打赏
  • 举报
回复
number &= (number - 1
好方法 ,佩服佩服
fire_woods 2007-07-23
  • 打赏
  • 举报
回复
我暂时不用DSP
加载更多回复(21)

33,006

社区成员

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

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