二进制中1的个数
来源:互联网 发布:淘宝咖啡店 编辑:程序博客网 时间:2024/06/07 07:15
题目:请实现一个函数,输入一个整数,输出该二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,。因此如果输入9,该函数输出2。
方法一:首先将n和1做与运算,判断n的最低位是否为1,接着将1左移1位,继续和n做与运算,这样反复左移,每次都能判断n其中的一位是不是1。
实现代码:
int NumberOf1(int n) { int count = 0; unsigned int flag = 1; while(flag) { if(n & flag) { count++; } flag = flag << 1; } return count; }
方法二:把一个整数减去1,再和原来的整数做与运算,会将该整数最右边的一个1变成0。
实现代码:
int NumberOf1(int n) { int m = 0; while(n){ m++; n = n&(n-1); } return m; }
方法三:
实现代码:
int NumberOf1(int n) { int temp = n; temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa) >> 1); temp = (temp & 0x33333333) + ((temp & 0xcccccccc) >> 2); temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0) >> 4); temp = (temp & 0x00ff00ff) + ((temp & 0xff00ff00) >> 8); temp = (temp & 0x0000ffff) + ((temp & 0xffff0000) >> 16); return temp;}
分析:
(n & 0x55555555) + ((n >> 1) & 0x55555555) 计算从低到高每一位相加,即相邻的2位中有几个1;(n & 0x33333333) + ((n >> 2) & 0x33333333) 计算从低到高每两位相加,即相邻的4位中有几个1 ;
接下来计算8位,16位,32位等,对于32位的机器来说,5条位运算语句就够了。
1 0
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- redis系列--服务级别命令
- 装箱、拆箱、自定义转换
- 描述指针数组和数组指针的区别
- 使用Spring MVC统一异常处理实战
- Eclipse SVN插件的帐号、密码修改
- 二进制中1的个数
- 最长连续递增子序列
- 微信处理类
- 深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
- Java 枚举7常见种用法
- ABAP实战屏幕SCREEN设计(二)
- 强悍的 ubuntu —— 配置开机启动项
- 使用Spring的AOP实现接口方法执行时间记录
- keil .sct分散加载文件及其应用(重点必看)