算法函数代码:

 1 int bit_count_one(unsigned int n)
 2 {
 3     n=(n&0X55555555)+((n>>1)&0x55555555);
 4     printf("%d\n",n);
 5
 6     n=(n&0X33333333)+((n>>2)&0x33333333);
 7     printf("%d\n",n);
 8
 9     n=(n&0X0f0f0f0f)+((n>>4)&0x0f0f0f0f);
10     printf("%d\n",n);
11
12     n=(n&0X00ff00ff)+((n>>8)&0x00ff00ff);
13     printf("%d\n",n);
14
15     n=(n&0X0000ffff)+((n>>16)&0x0000ffff);
16     printf("%d\n",n);
17
18     return n;
19 }

下面我们来详细解说如下代码:

0X55555555的二进制位01010101010101010101.......

n&0X55555555意思就是保留0,2,4,6,8.....等偶数位上的1,而(n>>1)&0X55555555是代表保留奇数位上的1,然后两者相加,相加的意思是将相邻的二进制相加,又因为二进制最大为1,1+1=10,用两个字节来存储且不会溢出

0X33333333的二进制为0011001100110011.........

与上意思相同,不过是以两个字节为单位,相邻的两个二进制位相加(左两个,有两个)

正好对应(n>>2)

0X0f0f0f0f的二进制为000011110000111100001111.......

总的来说:

1.用相邻的1位相加

2.用相邻的2位相加

3.用相邻的4位相加

4.用相邻的8位相加

5.用相邻的16位相加

实例:用上图二进制来做1101 1001

第一步,相邻的1位相加  (两个bit存储)

1+1=10   0+1=01  1+0=01  0+1=01

所以n=1001 0101

第二步,相邻的2位相加   (四个bit存储)

10+01=0011 01+01=0010

所以n=0011 0010

第三步,相邻的4位相加    (八个bit存储)

0011+0010=0000 0101     
 
由于样例为1个字节所以只有相邻的4的字节相加,当为int型时,则是相邻的16个字节相加

转载于:https://www.cnblogs.com/cdp1591652208/p/7697753.html

求二进制数中有多少个1相关推荐

  1. 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数

    所谓Population Count算法,即是指计算一个二进制数中1的个数的算法.具体来说,就是任意给定一个无符号整数N,求N的二进制表示中1的个数,比如N = 5(0101)时,返回2:N = 15 ...

  2. 求二进制数中1的个数(转)

    2.1 求二进制数中1的个数 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 分析与解法 大多数的读者都会有这样的反应:这个题目也太简 ...

  3. 编程之美-02数字之魅-求二进制数中1的个数

    题目:求二进制数中 1 的个数 对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 解法一:移位->判断->累计 解 ...

  4. 编程之美求二进制数中1的个数扩展题

    转自:http://s.sousb.com/?p=253 编程之美2.1节中的扩展题第1题:如果变量是32位的Dword,则如何统计该二进制数中1的个数. 对于该题,原本的想法还是想采用书中解法三,也 ...

  5. 编程之美读书笔记2.1—求二进制数中1的个数

    解法一: 可以举一个8位二进制的例子.对于二进制操纵,我们除以一个2,原来数字就会减少一个0(向右移一位).如果除的过程中有余,那么久表示当前位置有一个1. 以10100010为例: 第一次除以2时, ...

  6. 位操作-按位与之如何求二进制数的1个数

    题目 今天和大家分享一个题,求这个一个数的二进制有多少个1 题解 这个题挺有意思的,是通过按位与的操作,来判断多少个1 比如 输入为5, 二进制 101,有两个1 5&(5-1)=5& ...

  7. 求二进制数中1的个数

    <<编程之美>>中有这么个题目:对于一个字节的无符号整形变量,求其二进制表达形式中"1"的个数. 基础算法:辗转相除法 辗转相除法是十进制采用的算法,该算法 ...

  8. 2018阿里巴巴基础平台研发工程师实习生笔试题:一.十进制数转换成的二进制数中有几个1. 二.输出IP所在的网段

    1.输入一个十进制数转换成二进制数,输出二进制中有几个1? import java.util.Scanner;public class Main {public static void main(St ...

  9. python求极限中有算术平方根如何表达_Python求算数平方根和约数的方法汇总

    Python求算数平方根和约数的方法汇总 一.求算术平方根 a= x=int(raw_input('Enter a number:')) if x >= : while a*a < x: ...

最新文章

  1. 定了!5G商用牌照近期发放​​​​,透露两大信息(附:2019年5G行业关键材料及市场研究报告)...
  2. robot.txt 搜索引擎 蜘蛛爬虫 搜索规则
  3. Oracle数据库日期范围查询的两种实现方式
  4. 在sql查询中使用表变量
  5. 【今晚七点】:对话快手张亮——聊聊音视频出海
  6. this super的用法
  7. 的不定积分_不定积分大集合——方法篇
  8. 蓝桥杯单片机温度传感器DS18B20(基于STC15F2K60S2)
  9. android加速传感器应用,如何在android智能手机中使用加速计传感器查找位移距离?...
  10. 虚幻4英雄联盟模型分享——荆棘之刺婕拉
  11. android_静默安装/adb执行/软件搬家/消息派发
  12. ddos防火墙防御假人攻击测评
  13. oracle 导入攻略,oracle10g下expdp自动导出并上传全攻略
  14. Linux运维10:scp命令详解
  15. Vue+style 动态样式绑定(收藏图标)
  16. NB模块-QS100-默认demo
  17. IoT物联网平台如何实现设备全球分发、就近接入?
  18. 2022年最富有的科技亿万富翁前二十名,中国占3位
  19. 关于金融风险数据的ETL到分析
  20. C#实现二维码扫码登录

热门文章

  1. 亮风台新提端到端AR投影光学补偿算法 | CVPR 2019 Oral
  2. 城市连动纯js代码DEMO
  3. office套件_OfficeSuite v4.9免费专业Office办公套件
  4. colmap安装后如何使用教程
  5. Tobii眼动仪 python SDK 时间同步的技巧
  6. 【知识整理】安卓(Android)应用上传360应用市场步骤详解
  7. Docker镜像和容器
  8. 百度云管家开机启动如何取消
  9. Ask HTG:格式化“隐形”硬盘,更改Android中的默认应用以及如何使用新的Kindle Fire...
  10. pushplus 开放接口文档