求二进制数中有多少个1
算法函数代码:
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相关推荐
- 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数
所谓Population Count算法,即是指计算一个二进制数中1的个数的算法.具体来说,就是任意给定一个无符号整数N,求N的二进制表示中1的个数,比如N = 5(0101)时,返回2:N = 15 ...
- 求二进制数中1的个数(转)
2.1 求二进制数中1的个数 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 分析与解法 大多数的读者都会有这样的反应:这个题目也太简 ...
- 编程之美-02数字之魅-求二进制数中1的个数
题目:求二进制数中 1 的个数 对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 解法一:移位->判断->累计 解 ...
- 编程之美求二进制数中1的个数扩展题
转自:http://s.sousb.com/?p=253 编程之美2.1节中的扩展题第1题:如果变量是32位的Dword,则如何统计该二进制数中1的个数. 对于该题,原本的想法还是想采用书中解法三,也 ...
- 编程之美读书笔记2.1—求二进制数中1的个数
解法一: 可以举一个8位二进制的例子.对于二进制操纵,我们除以一个2,原来数字就会减少一个0(向右移一位).如果除的过程中有余,那么久表示当前位置有一个1. 以10100010为例: 第一次除以2时, ...
- 位操作-按位与之如何求二进制数的1个数
题目 今天和大家分享一个题,求这个一个数的二进制有多少个1 题解 这个题挺有意思的,是通过按位与的操作,来判断多少个1 比如 输入为5, 二进制 101,有两个1 5&(5-1)=5& ...
- 求二进制数中1的个数
<<编程之美>>中有这么个题目:对于一个字节的无符号整形变量,求其二进制表达形式中"1"的个数. 基础算法:辗转相除法 辗转相除法是十进制采用的算法,该算法 ...
- 2018阿里巴巴基础平台研发工程师实习生笔试题:一.十进制数转换成的二进制数中有几个1. 二.输出IP所在的网段
1.输入一个十进制数转换成二进制数,输出二进制中有几个1? import java.util.Scanner;public class Main {public static void main(St ...
- python求极限中有算术平方根如何表达_Python求算数平方根和约数的方法汇总
Python求算数平方根和约数的方法汇总 一.求算术平方根 a= x=int(raw_input('Enter a number:')) if x >= : while a*a < x: ...
最新文章
- 定了!5G商用牌照近期发放​​​​,透露两大信息(附:2019年5G行业关键材料及市场研究报告)...
- robot.txt 搜索引擎 蜘蛛爬虫 搜索规则
- Oracle数据库日期范围查询的两种实现方式
- 在sql查询中使用表变量
- 【今晚七点】:对话快手张亮——聊聊音视频出海
- this super的用法
- 的不定积分_不定积分大集合——方法篇
- 蓝桥杯单片机温度传感器DS18B20(基于STC15F2K60S2)
- android加速传感器应用,如何在android智能手机中使用加速计传感器查找位移距离?...
- 虚幻4英雄联盟模型分享——荆棘之刺婕拉
- android_静默安装/adb执行/软件搬家/消息派发
- ddos防火墙防御假人攻击测评
- oracle 导入攻略,oracle10g下expdp自动导出并上传全攻略
- Linux运维10:scp命令详解
- Vue+style 动态样式绑定(收藏图标)
- NB模块-QS100-默认demo
- IoT物联网平台如何实现设备全球分发、就近接入?
- 2022年最富有的科技亿万富翁前二十名,中国占3位
- 关于金融风险数据的ETL到分析
- C#实现二维码扫码登录
热门文章
- 亮风台新提端到端AR投影光学补偿算法 | CVPR 2019 Oral
- 城市连动纯js代码DEMO
- office套件_OfficeSuite v4.9免费专业Office办公套件
- colmap安装后如何使用教程
- Tobii眼动仪 python SDK 时间同步的技巧
- 【知识整理】安卓(Android)应用上传360应用市场步骤详解
- Docker镜像和容器
- 百度云管家开机启动如何取消
- Ask HTG:格式化“隐形”硬盘,更改Android中的默认应用以及如何使用新的Kindle Fire...
- pushplus 开放接口文档