`
wjboy49
  • 浏览: 284711 次
  • 性别: Icon_minigender_1
  • 来自: 湖南岳阳
社区版块
存档分类
最新评论

0/1的奥秘:直接取二进制中1的个数的算法

阅读更多

【问题描述】:给一段位数为n的二进制数,统计其中1的个数

【算法概述】:将二进制数按照每2位分组,计算每2位中1的个数,保存在一个二进制数中。然后迭代上述过程,就得到了每4位中1的个数,每8位中的 1的个数,迭代下去,最终得到n位中1的个数

【算法复杂度】:log以2为底的n

【算法描述】:摘自http://www.loveunix.net/html/200405/29967.html , 作者: wingc  发布日期: 2004-5-21

unsigned long CountBit(unsigned long X)

{

X = (X & 0x55555555) + (X >> 1 & 0x55555555);

X = (X & 0x33333333) + (X >> 2 & 0x33333333);

X = (X & 0x0F0F0F0F) + (X >> 4 & 0x0F0F0F0F);

X = (X & 0x00FF00FF) + (X >> 8 & 0x00FF00FF);

X = (X & 0x0000FFFF) + (X >> 16 & 0x0000FFFF);

return(X);

}
/*
0x55555555: 01010101010101010101010101010101
0x33333333: 00110011001100110011001100110011
0x0F0F0F0F: 00001111000011110000111100001111
0x00FF00FF: 00000000111111110000000011111111
0x0000FFFF: 00000000000000001111111111111111
*/

作者: wingc  发布日期: 2004-5-22

哈哈,经指点,大概懂了,其实偶一直在想那个十进制数的变换过程应该有数学公式推导,导致偶一直在十进制数上打转,要是把注意力仍停留在二进制数 上,就不难理解了。(有可能真的有数学公式吧,但是与其找15->10->4的公式,不如直接观察二进制串的变化过程更容易明白)

偶 再拿一个长点的数(8位)说明一下,无双大哥看看偶真的理解没有

<!-- emo&<img src="http://bbs.loveunix.net/images/smilies/smile.gif" align="absmiddle" border="0">--><!-- endemo-->



10101100(172)
| 第一次迭代(与01010101运算)
V
00000100 + 01010100 = 01 01 10 00

这一步将10101100每 两位上1的个数1(01)、1(01)、2(10)、0(00)计算出来了,但是这个值由于“权值”的问题,就是二进制数所在位数的问题,除了最后两位 00外前面三个都不能表达出真实意义,所以还需迭代

01011000
| 第二次迭代(与00110011运算)
V
00010000 + 00010010 = 0010 0010
这一步将10101100每四位数上1的个数2(0010)、2(0010)计算出来了,其实就是将上一步 运算两种颜色的值分别成对相加得到,同时,调整调整了“权值”,上一步中第一个01和第三个10的“权值”都下降两位,这样使后四位的0010的“权值” 已经“正常”,可以表达实际2的意义了,但前四位仍在高位,还不能真实表达,仍需迭代

00100010
| 第三次迭代(与00001111运算)
V
0010 + 0010 = 0100(4)
这一步得到了1的个数的实际意义值,上一步 第一个0010由于“权值”问题,还不能真实表达,而这一次,第一个0010“权值”下降四位,可以表达实际意义了,这样加起来就是实际的1的个数了

总 结,其实就是先算出每两位1的个数的值,但是由于所在二进制位数的问题,导致了除最后两位的值有真实的1的计数意义外,其他的都还不能真实表达,所以来第 二次迭代,这次迭代计算出了每四位的1的个数,但是同样的原因,出了最后四位值有真实的计数意义外,前四位仍然不能真实表达,再来第三次迭代,这次迭代算 出了每八位的1的个数,也就是这个8位二进制数的1的个数啦~~

分享到:
评论

相关推荐

    《有趣的二进制》附书源码

    二进制,即由0和1组成的数字系统,是现代电子计算机技术的基石。它在计算机科学中的应用无处不在,包括数据存储、计算过程、网络传输等。这本书的附书源码提供了丰富的实例和练习,帮助读者更好地理解和应用二进制...

    Multisim八位二进制转三位十进制

    1. **二进制到十进制的转换**:对每一位二进制数,乘以对应的权重(2^7, 2^6, ..., 2^0),然后将所有结果相加。在Multisim中,可以使用D型触发器和加法器来实现这个过程。 2. **位权处理**:由于我们要得到三位十...

    算法心得:高效算法的奥秘.docx

    算法心得:高效算法的奥秘是计算机科学中的一种重要技术,指的是能够在有限时间内解决大规模、复杂问题的算法。这类算法具有简单性、通用性、并行性和鲁棒性等特点,能够大大提高计算效率和精度,降低计算成本。 ...

    十进制转换为二进制PPT学习教案.pptx

    在十进制系统中,我们使用十个基本符号——0到9进行计数,而二进制系统则仅使用两个符号——0和1。这一看似简单的差异,却构成了计算机技术的核心。计算机之所以使用二进制,是因为它具有硬件实现简单、稳定性高的...

    存储的奥秘:数据存储、备份与恢复完全解析

    存储很有奥秘,那么对数据存储、备份与恢复完全解析

    《算法心得 高效算法的奥秘 原书第2版》.pdf

    《算法心得 高效算法的奥秘 原书第2版》pdf版 推荐阅读

    加密的奥秘:解密算法轮数的作用与实现

    4. **密钥(Key)**:一个用于控制加密和解密过程的秘密参数,可以是数字、字符串或二进制序列。 5. **加密(Encryption)**:使用加密算法和密钥将明文转换成密文的过程。 6. **解密(Decryption)**:使用相同的...

    行业文档-设计装置-一种二进制数教学演示器.zip

    二进制(Binary)是一种数字表示方式,只使用两个符号:0和1。这种系统是计算机内部处理和存储信息的基础,因为计算机电路能够轻松识别和处理这两种状态。在二进制中,每一位(bit)的权重由位置决定,最右边的位...

    算法心得:高效算法的奥秘 第二版

    在《算法心得:高效算法的奥秘》中,作者给我们带来了一大批极为诱人的知识,其中包括各种节省程序运行时间的技巧、算法与窍门。学习了这些技术,程序员就可写出优雅高效的软件,同时还能洞悉其中原理。这些技术极为...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    5.3.2 比较两个字组前导0的个数 96 5.3.3 与对数函数的关系 96 5.3.4 应用 97 5.4 后缀0计数 97 5.5 习题 105 第6章 在字组中搜索位串 106 6.1 寻找首个值为0的字节 106 6.1.1 0值字节位置函数的一些简单推广...

    补充奥数从数的二进制谈起.doc

    将一个十进制数转换为二进制可以通过不断除以2并记录余数的方式进行,这也就是所谓的“除二取余法”。这一过程,通过将数值除以2,直到商为0为止,将所有余数逆序排列,得到的就是对应的二进制数。 不仅如此,文档...

    算法心得:高效算法的奥秘

    本书《算法心得:高效算法的奥秘》由一位在IBM工作超过50年的资深计算机专家撰写,是算法领域具有重要影响力的著作之一。根据描述,书中系统性地介绍了高效、优雅且巧妙的算法,并从数学的角度对这些算法背后的原理...

    速算奥秘:奥林匹克算法新添 - [黄祖训].pdf

    ### 速算奥秘:奥林匹克算法新添 #### 黄祖训 著 #### 武汉大学出版社 **速算奥秘** 这一主题不仅涵盖了数学领域中的一种高效计算方式,更深入探讨了如何利用数学原理和计算技巧来简化复杂的计算过程。随着科技的...

    掌握系统调用与标准I/O:Linux系统编程精要

    深入Linux系统编程的核心,探索系统调用的奥秘和标准I/O库的强大功能。《系统调用与标准I/O库》资源为您揭开了系统编程的复杂面纱,从内核到库的每个层面,提供了全面的指导和深入的解析。 系统调用概述:了解系统...

    探索生命数据的奥秘:聚类算法在生物信息学中的革命性应用

    1. **K-Means 聚类**:这是最常用的聚类算法之一,通过迭代选择K个中心点,将数据点分配到最近的中心点所代表的簇中,然后更新中心点的位置,直到满足停止条件。 2. **层次聚类**:这种算法不需要预先指定簇的数量...

    高效程序的奥秘(Hacker's Delight) 中英文版

    2. **数值计算**:书中讨论了二进制和十进制转换、浮点数表示、整数除法和取模等计算问题,这些都是程序设计中的常见挑战。作者还介绍了如何利用位操作技巧来提高这些计算的效率。 3. **数据结构与算法**:书中介绍...

    算法心得 高效算法的奥秘原书第2版) .zip

    《算法心得:高效算法的奥秘》第二版是一本深入探讨算法设计与分析的经典著作,旨在帮助读者理解和掌握如何创建高效、实用的算法。这本书涵盖了算法领域的诸多核心概念,包括排序、搜索、图论、动态规划等,为读者...

    探索AI画布背后的奥秘:AI绘画软件算法复杂度解析

    ### 探索 AI 画布背后的奥秘:AI 绘画软件算法复杂度解析 AI绘画,作为一种新兴的艺术创作方式,正逐步改变着我们对视觉艺术的理解与体验。这一技术的发展,离不开深度学习领域的进步,尤其是生成对抗网络(GANs)...

    编码的奥秘(更好的理解计算机)

    在计算机的世界里,所有信息——无论是文字、图像还是声音——都必须转化为二进制(0和1)的形式。这是因为计算机硬件只能识别和处理这种最基本的逻辑状态。例如,ASCII编码是一种常见的字符编码,将英文字符与7位二...

Global site tag (gtag.js) - Google Analytics