如何计算二进制中1的个数?

全部遍历一遍?

不……不……这不是最优解……

下面看一段代码:

int bitcount (unsigned int n)
{int count=0 ;while (n) {count++ ;n &= (n - 1) ;}return count ;
}

太巧啦~

刚看到这个代码的时候,觉得这个解法真是太巧啦、太精妙啦(不要怪我没见过世面 )~

下面我们来理解一下这个代码,这个代码中核心的代码只有一行,就是 n &= (n - 1) ,我们分开看一下:

  1. n-1:一个二进制的数减1,就是将这个二进制最右边的那个1变成0,然后它后边的所有位置都变成1~ 举例:0011 0100,减1(n-1)后变成:0011 0011。
  2. n &= (n-1),并操作就会将有0的位置都变成0,上面的例子的结果就是0011 0000,然后再赋值给n,这时n就去掉了一个1,或者叫做计数了一个1。以此类推,就可以得到1的个数。
0011 0100 - 1 = 0011 0011
0011 0100 & 0011 0011 = 0011 0000  // 计数一个1
0011 0000 - 1 = 0010 1111
0011 0000 & 0010 1111 = 0010 0000  // 计数两个1
0010 0000 - 1 = 0001 1111
0010 0000 & 0001 1111 = 0000 0000  // 计数三个1,程序停止

这样只需要循环3次,而如果直接遍历就会循环6次,性能明显提高啦~

给个极端的例子 1000 0000,这个直接遍历得遍历8次,而通过上面的代码只需要遍历

1次~1次~~1次~~~

真是太精妙啦~


大家还有更优解吗?还有类似的这种精妙的算法吗?有那种让你眼前一亮的简短代码吗?欢迎留言啦~~~

求栈中元素个数算法_精妙的算法——计算二进制中1的个数相关推荐

  1. 基于visual Studio2013解决面试题之0410计算二进制中1的个数

     题目 解决代码及点评 /*求一个数中,二进制表示方式中1的个数范例算法采用分治思想,通过位操作计算二进制中1的个数 */#include <iostream> using name ...

  2. 一、计算二进制中1的个数

    1.快速法 int BitCount2(unsigned int n) {unsigned int c =0 ;while(n!=0){n &= (n -1) ; // 清除最低位的1c++; ...

  3. 【剑指 Offer_15】二进制中1的个数_PythonJava_逐位相与解法

    剑指 Offer 15. 二进制中1的个数 "前戏" 正题--剑指 Offer 15. 二进制中1的个数 题目描述 方法一.逐位相与 Python解法 Java解法 复杂度分析 方 ...

  4. 求二进制中1的个数(编程之美2.1)

    行文脉络 解法一--除法 解法二--移位 解法三--高效移位 解法四--查表 扩展问题--异或后转化为该问题 对于一个字节(8bit)的变量,求其二进制"1"的个数.例如6(二进制 ...

  5. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  6. 第2章 数字之魅——求二进制中1的个数

    求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...

  7. php统计变量的位数,php实现统计二进制中1的个数算法示例

    本文实例讲述了php实现统计二进制中1的个数算法.分享给大家供大家参考,具体如下: 问题 输入一个十进制整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解决思路 这是个位运算的题目. 解法一 ...

  8. C/C++求一个整数的二进制中1的个数

    求一个整数的二进制中1的个数 收藏 题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析:这是一道很基本的考查位运算的面试题.包 ...

  9. 每列大于0的个数_二进制中1的个数(剑指offer第十四天)

    二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...

最新文章

  1. 远程服务器如何传文件大小,linux服务器远程传文件大小
  2. matlab显示YCrCb的图像,【Matlab系列】读取并显示YUV视频文件
  3. 华为服务器显示403,禁止访问403是什么意思 网页提示403怎么解决
  4. python英语字典程序修改_详解如何修改python中字典的键和值
  5. C语言编写Windows服务程序
  6. 计算机系统操作在线作业,电子科大《计算机操作系统》在线作业3
  7. 中国光伏新增装机容量猛增
  8. 关于--在 System.Threading.ThreadAbortException 中第一次偶然出现的“mscorlib.dll”类型的异常(转)...
  9. 如何使用html如何安装,node.js – 如何使用全球安装的grunt-html?
  10. C++数据类型之结构体的练习(用到结构体的赋值,利用结构体元素排序以及查找)
  11. CSS布局相关基本概念
  12. python优化网站_小旋风网站优化 - 致力于Python高品质站群系统的产品研发
  13. Datawhale学习记录 动手学数据分析(以Kaggle泰坦尼克号为案例)——Task01数据加载及探索性数据分析
  14. “有心杀敌,无力回天”的无奈
  15. Debian 查看 硬盘 SD卡 容量 内存大小
  16. 06-播放器-搭建媒体服务器测试videojs
  17. 定积分的计算与辛普森积分及龙贝格积分
  18. 领悟《信号与系统》之 信号与系统的描述-上节
  19. 【Hawk】高级教程——post参数采集万方医学网论文
  20. 《如何让你爱的人爱上你》分享

热门文章

  1. MAGIX VEGAS Pro 16.0.0.424 x64 中文免费版
  2. win install php pdo,windows 下安装composer-setup.exe出现找不到php_pdo_oci.dll' 。可扩展里面有的。。...
  3. 修改manager server端口与appserver rest端口
  4. gzinflate php cetnos,Centos 6.5升级git版本的办法
  5. 电脑的CPU可直接解读的数据机器码机器语言(machine language)是一种指令集的体系
  6. autoGluon-教程3-在kaggle竞赛中的应用
  7. 通信网络以及通信类公司
  8. 【linux】循序渐进学运维-cat
  9. Python的selenium自动化项目实例
  10. 云、边、端协同:边缘计算打开了更大的想象空间