一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen]

weicai_chen
weicai_chen
等级:
结帖率:95.12%
楼主 发表于: 2007-06-26 22:51:44
 

如何以最快的速度计算出一个二进制数中1的个数?假设这个二进制数位数可以很长,比如有100位以上或更多。。。

大家说说自己的想法。

更多
0

分享到:

相关主题推荐:
二进制
面试题
算法

回复次数:42

HUNTON

HUNTON
等级:

#1
得分:3

回复于:
2007-06-27 08:47:25

这个不是前一段那个101个面试题中的一题吗。

计算整数number的比特位值为1的位数

int getBits(int number)
{
    int retval = 0;

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

oo

oo
等级:

#2
得分:0

回复于:
2007-06-27 08:56:58

有个不用循环的算法,不过看不太懂

SoftBomb

SoftBomb
等级:

#3
得分:0

回复于:
2007-06-27 09:01:27

做个映射数组行不,以字节值为key,value就是对应的1的个数。然后就能8位8位的去统计了。
增加的时间就是建立映射数组的时间,在位数少(几千几万)的时候应该没有优势。更多了还行。

fire_woods

fire_woods
等级:

#4
得分:3

回复于:
2007-06-27 09:13:05

unsigned int
ones32(register unsigned int x)
{
        /* 32-bit recursive reduction using SWAR...
   but first step is mapping 2-bit values
   into sum of 2 1-bit values in sneaky way
*/
        x -= ((x >> 1) & 0x55555555);
        x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
        x = (((x >> 4) + x) & 0x0f0f0f0f);
        x += (x >> 8);
        x += (x >> 16);
        return(x & 0x0000003f);
}

ahjoe

ahjoe
等级:

#5
得分:0

回复于:
2007-06-27 12:19:02

不用循环,可能吗?

iceheart

iceheart
等级:

#6
得分:1

回复于:
2007-06-27 13:52:04

http://www.everything2.com/index.pl?node_id=1181258

weicai_chen

weicai_chen
等级:

#7
得分:0

回复于:
2007-06-27 18:14:51

哪位高手解释一下上面两个算法?

guoshanhe

guoshanhe
等级:

#8
得分:0

回复于:
2007-06-27 20:36:50

好题,mark

medie2005

medie2005
等级:
3

#9
得分:3

回复于:
2007-06-27 21:03:24

关键是:number &= (number - 1)

讨论之。

1):number 为奇数,则number &= (number - 1)萃取末尾1,并将结果赋给number。计数器显然要加1。
2):number 为偶数,则number &= (number - 1)number最末尾的1置成0,其余不变,并将结果赋给number。若此时number不为0,则说明仍可继续,由于已经将number最末尾的1置成0,因此,计数器也要加1。

详见《高效程序的奥秘》。

jiangbin00cn

jiangbin00cn
等级:

#10
得分:0

回复于:
2007-06-27 21:14:01

mark

lexchi

lexchi
等级:

#11
得分:0

回复于:
2007-06-27 22:03:50

M

wxspll

wxspll
等级:

#12
得分:0

回复于:
2007-06-28 02:47:48

mark

shu_yoyo

shu_yoyo
等级:

#13
得分:0

回复于:
2007-06-28 13:21:42

mark一下

savagegan

savagegan
等级:

#14
得分:0

回复于:
2007-06-28 14:21:35

mark

xiaocai0001

xiaocai0001
等级:
3
2

#15
得分:0

回复于:
2007-06-28 15:13:12

高效程序的奥秘里提到过...

yy_msdn

yy_msdn
等级:

#16
得分:0

回复于:
2007-07-22 20:56:03

但是他那个数可能是100位啊?int能装的下吗?

NowCan

NowCan
等级:

#17
得分:0

回复于:
2007-07-22 21:46:56

按4字节分组啊。

yy_msdn

yy_msdn
等级:

#18
得分:0

回复于:
2007-07-22 21:58:39

把它当作字符串来处理吗?

zhuying1983

zhuying1983
等级:

#19
得分:0

回复于:
2007-07-23 10:27:46

number &= (number - 1
好方法 ,佩服佩服

SoftBomb

SoftBomb
等级:

#20
得分:0

回复于:
2007-07-23 11:51:17

快速将所有的1都置零,NB

gxqcn

gxqcn
等级:

#21
得分:0

回复于:
2007-07-23 13:36:52

我前不久查阅了 Intel 的技术资料,Intel SSE4 新增了“POPCNT”指令,
一条指令即可获得 16/32/64 bits 中含有 bits set to 1 的数目,
若用它,以上所有技巧都将相形失色。

fire_woods

fire_woods
等级:

#22
得分:0

回复于:
2007-07-23 15:58:39

俺做ARM的.

gxqcn

gxqcn
等级:

#23
得分:0

回复于:
2007-07-23 17:09:05

我也写ARM程序(并用DSP)。

fire_woods

fire_woods
等级:

#24
得分:0

回复于:
2007-07-23 17:26:42

我暂时不用DSP

settingsun86

settingsun86
等级:

#25
得分:0

回复于:
2007-07-24 10:24:32

int GetBits(int number)
{
int retval = 0;

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

return retval;
}

bao110908

bao110908
等级:
4
5
6

#26
得分:0

回复于:
2007-07-24 10:53:00

fire_woods 的方法很好,说细的算法说明可以参看《Hacker's Delight》(中文书名《高效程序的奥秘》)里面有讲解。

jiangbin00cn

jiangbin00cn
等级:

#27
得分:0

回复于:
2007-07-24 21:48:00

int getBits(int number)
{
    int retval = 0;

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

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

如果内存宽裕,可以造表,呵呵,我是tablelover,
高效,异读,就是浪费内存。

whycadi

whycadi
等级:

#28
得分:0

回复于:
2007-07-25 22:02:36

fire_woods(风林火山)的算法不错,两两合并求1的个数的和,虽然32位上优势不大,如果是64位的话就比移位快很多了。比查表省地方多了。

krfstudio

krfstudio
等级:

#29
得分:0

回复于:
2007-07-26 17:03:34

MARK,学到不少东西,呵呵。

sankt

sankt
等级:

#30
得分:0

回复于:
2007-07-26 23:48:37

比较经典的问题了

trueytht

trueytht
等级:

#31
得分:0

回复于:
2007-08-13 20:38:08

问一下具体的实现,现在我知道了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) 就行了.
   大家都怎么实现把长串分割的呢?

jiangbin00cn

jiangbin00cn
等级:

#33
得分:0

回复于:
2007-08-15 22:25:48

1000万的0/1输入
//////////////////////////
这里不明白,计算机内部数据都是以字节为单位的,1000万个0/1输入,每个0/1占一个字节?这样的话是你之前处理的问题,而不是这个算法的问题

个人认为就速度而言造表法最快,不过如果是嵌入式开发两两合并求1的算法最优,关键是能够拓展思路

NowCan

NowCan
等级:

#34
得分:0

回复于:
2007-08-16 12:49:48

1000万个0/1输入,每个0/1占一个字节?
==
是啊我也糊涂了,如果这样的话,直接扫描一遍就很快了。

NowCan

NowCan
等级:

#35
得分:0

回复于:
2007-08-16 12:50:28

直接相加就够了。

trueytht

trueytht
等级:

#36
得分:0

回复于:
2007-08-16 19:49:15

看来我是没明白原题的意思,该算法的输入是什么呢?

ahjoe

ahjoe
等级:

#37
得分:0

回复于:
2007-08-19 15:08:06

按Byte查表, 不只一个字节就循环

DLMU_net

DLMU_net
等级:

#38
得分:0

回复于:
2007-08-22 15:02:51

mark~

lzxwyh

lzxwyh
等级:

#39
得分:0

回复于:
2007-08-26 22:25:30

把0替换掉,剩下的长度不就是1的个数么?

hehehengha1

hehehengha1
等级:

#40
得分:0

回复于:
2009-10-10 00:17:57

咋和低位的没啥区别 都是循环移位的??
高手给个意见罗

ccm_0

ccm_0
等级:

#41
得分:0

回复于:
2010-09-23 17:10:39

学习一下

lj836263698

lj836263698
等级:

#42
得分:0

回复于:
2010-09-28 18:49:41

我来挺挺!!!!!!!!!!1我来挺挺!!!!!!!!!!1

ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [的更多相关文章

  1. shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

    shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...

  2. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  3. ZT 计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48

    计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48 分类: C/C++ [转]计算一个无符整数中1Bit的个数(1)   Count the number of bits ...

  4. STM32定时器输出PWM频率和步进电机控制速度计算

    1.STM32F4系列定时器输出PWM频率计算 第一步,了解定时器的时钟多少: 我们知道AHP总线是168Mhz的频率,而APB1和APB2都是挂在AHP总线上的. (1)高级定时器timer1, t ...

  5. [AI开发]目标跟踪之速度计算

    基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景).计数(交通类应用场景.安防类应用场景)以及行为检测(交 ...

  6. 你的以太网速度足够快吗?四种更快的速度正在路上&#183;&#183;&#183;&#183;&#183;&#183;

    以太网的未来将远远超越下一个最快速度:为无处不在的网络协议绘制路径的网络project师们正在寻找新版本号来服务于各种应用程序. 在上周六的以太网联盟(一个行业组织,用于促进IEEE以太网标准)会议上 ...

  7. 更快的速度、更好的服务——易普优APS云排程

    众所周知软件执行效率受制于硬件性能,市面上的APS产品多为单机版本,企业要应用好APS,保证紧急插单.计划下发全程无忧,用户电脑硬件性能是不容忽视的一大瓶颈.APS的直接用户是车间管理人员.计划员,而 ...

  8. 阿里云openssl升级,实现nginx主动推送,nginx主动推送能够有效减少不必要的报文传输,减少用户请求次数,以达到更快访问速度

    现有版本检查 [root@node3 ~]# openssl version               #这个版本是无法支持http2.0主动推送功能.需要升级为2019版本. OpenSSL 1. ...

  9. 在MS SQLSERVER中如何最快的速度清空所有用户表的数据

    有时候我们需要清空数据库中所有用户表的数据,如果一张表一张表的清空的话,遇到一个庞大的数据系统估计得崩溃了.  用游标加上用变量来引用表名就可以做到这一点. 用变量来引用表名对表操作可以用在存储过程中 ...

随机推荐

  1. 用fullPage来实现全屏滚动效果

    [注意]所有的page要用div包裹,id为fullpage.不能直接包在body中 [使用fullpage的步骤] 1.导入 JQuery.js,fullpage.js,fullpage.css   ...

  2. 阿里云搭建hadoop集群服务器,内网、外网访问问题(详解。。。)

    这个问题花费了我将近两天的时间,经过多次试错和尝试,现在想分享给大家来解决此问题避免大家入坑,以前都是在局域网上搭建的hadoop集群,并且是局域网访问的,没遇见此问题. 因为阿里云上搭建的hadoo ...

  3. Linux下socket通信和多线程

    服务端socket流程:socket() –> bind() –> listen() –> accept() –> 读取.发送信息(recv,send等) 客户端socket流 ...

  4. nylg 开方数

    开方数 时间限制:500 ms  |  内存限制:65535 KB 难度:3   描述 现在给你两个数 n 和 p ,让你求出 p 的开 n 次方.   输入 每组数据包含两个数n和p.当n和p都为0 ...

  5. 获取本地内网和外网IP地址

    public class IPUtil { /// <summary> /// 获取本地内网IP /// </summary> /// <returns></ ...

  6. 无效的列类型:getTimestamp not implemented for class oracle.jdbc.driver.T4CNumberAccessor

    错误信息: 无效的列类型:getTimestamp not implemented for class oracle.jdbc.driver.T4CNumberAccessor 错误原因:经过排查发现 ...

  7. 移动端地区选择mobile-select-area插件的使用方法

    顾名思义,mobile-select-area插件就是使用在移动端上的进行地区选择的插件,而且使用方法简单,我就说我是怎么用的吧 一.准备工作 首先肯定要下载插件对应的css+js文件, 当你下载好这 ...

  8. 规划行业GIS云平台“城智图”上线运行

    首先祝各位朋友中秋节快乐! 城智图(www.imapcity.com)是远景GIS云平台的首个应用项目,它以全新的方式为规划部门提供地理信息服务,改变了以前规划部门只有CAD成果数据,难以查阅.深入挖 ...

  9. How To Improve Deep Learning Performance

    如何提高深度学习性能 20 Tips, Tricks and Techniques That You Can Use ToFight Overfitting and Get Better Genera ...

  10. SQL注入 payload 记录

    使用 REGEXP盲注 payload select user() from users where user_id=1 and (select(user)from users where user_ ...