社区
数据结构与算法
帖子详情
一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数?
weicai_chen
2007-06-26 10:51:44
加精
如何以最快的速度计算出一个二进制数中1的个数?假设这个二进制数位数可以很长,比如有100位以上或更多。。。
大家说说自己的想法。
...全文
4467
42
打赏
收藏
一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数?
如何以最快的速度计算出一个二进制数中1的个数?假设这个二进制数位数可以很长,比如有100位以上或更多。。。 大家说说自己的想法。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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位的话就比移位快很多了。比查表省地方多了。
火龙果被占用了
2007-07-24
打赏
举报
回复
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)
曾经遇到的
一个
c语言
面试题
题目描述:对于
一个
字节(8bit)的无符号整形变量,求
二进制
表示中“1”的
个数
,要求
算法
执行效率尽可能地高。
ZT CSDN 如何以
最快
的
速度
计算
出
一个
二进制
数中
1的
个数
? [
一道
算法
面试题
:如何以
最快
的
速度
计算
出
一个
二进制
数中
1的
个数
? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chenweicai_chen等级:结帖率:95.12% 楼主 发表于: 2007-06-26 22:51:44 如何以
最快
的
速度
计算
出
一个
二进制
数中
1的
个数
?假设这个
二进制
数位数可以很长,比如有100位以上或更...
如何以
最快
的
速度
计算
出
一个
二进制
数中
1的
个数
题目:如何以
最快
的
速度
计算
出
一个
二进制
数中
1的
个数
重点在于,这里有十亿或万亿个int数字,怎样做才能优化
算法
呢?解答:统计
一个
字节序列中1的
个数
,我首先想到的是最简单,把这
个数
每次右移一位,然后与0x01逻辑与进行统计,相当于总共将真个字节序列遍历了一遍。然而仔细想想,
一个
十亿或万亿的字节序列,能存到一
个数
(或称为变量)中?必然不可以,因此这是陷阱所在。while(num)
计算
十进制数转化为2进制数之后中1的
个数
方法有很多,大致记两个 1,拿最后一位对比,然后移位 2,利用n&=(n-1) 这种黑科技的方法进行统计,这种循环次数能够统计
出
十进制数转化为2进制数之后其中1的
个数
问题描述 任意给定
一个
32位无符号整数n,求n的
二进制
表示中1的
个数
,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是
一道
比较经典的题目了,相信不少人面试的时候可能遇到过这道
算法
-求
二进制
数中
1的
个数
算法
-求
二进制
数中
1的
个数
问题描述 任意给定
一个
32位无符号整数n,求n的
二进制
表示中1的
个数
,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是
一道
比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了几种方法来实现这道题,相信很多人可能见过下面的
算法
,但我相信很少有人见到本文中所有的
算法
。如果您上头上有更好的
算法
,或者本文没有提到
数据结构与算法
33,025
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章