整数的二进制表示中 1 的个数
2014-05-14 00:00
218 查看
摘要: 题目:输入一个整数,求该整数的二进制表达中有多少个 1。
例如输入 10,由于其二进制表示为 1010,有两个 1,因此输出 2。
解法二与解法一类似,通过向右位移依次处理,每次与1按位与统计1的个数
解法三比较奇妙,每次将数字的最后一位处理成0,统计处理的次数,进而统计1的个数
参考资料:
《编程之美》 电子工业出版社
题目:整数的二进制表示中 1 的个数
要求:
输入一个整数,求该整数的二进制表达中有多少个 1。例如输入 10,由于其二进制表示为 1010,有两个 1,因此输出 2。
分析:
解法一是普通处理方式,通过除二余二统计1的个数;解法二与解法一类似,通过向右位移依次处理,每次与1按位与统计1的个数
解法三比较奇妙,每次将数字的最后一位处理成0,统计处理的次数,进而统计1的个数
代码实现(GCC编译通过):
#include "stdio.h" #include "stdlib.h" int count1(int x); int count2(int x); int count3(int x); int main(void) { int x; printf("输入一个数:\n"); setbuf(stdin,NULL); scanf("%d",&x); printf("%d转二进制中1的个数是:",x); printf("\n解法一:%d",count1(x)); printf("\n解法二:%d",count2(x)); printf("\n解法三:%d",count3(x)); printf("\n"); return 0; } //除二、余二依次统计每位 int count1(int x) { int c=0; while(x) { if(x%2==1) c++; x/=2; } return c; } //向右移位,与1按位与统计每位 int count2(int x) { int c=0; while(x) { c+=x & 0x1; x>>=1; } return c; } //每次将最后一个1处理成0,统计处理次数 int count3(int x) { int c=0; while(x) { x&=(x-1); c++; } return c; }
参考资料:
《编程之美》 电子工业出版社
相关文章推荐
- 金山笔试题 "写一个函数,对给定整数的二进制表示进行描述"
- 将整数的二进制表示转浮点数的二进制表示
- 计算一个整数二进制表示时有多少位是为1的算法
- 1.1.9 java用二进制表示十进制整数(不用Integer.toBinaryString(N)方法)
- 逆转一个整数的二进制表示问题
- 逆转一个整数的二进制表示问题
- 交换一个整数二进制表示中的奇数位和偶数位
- 整数n的二进制表示中所含1的个数
- 28.整数的二进制表示中1的个数
- 求整数A和整数B的二进制表示中有多少位是不同的?
- 整数二进制表示中1的个数
- 求整数N的二进制表示中1的个数
- 寻找一个整数二进制表示中1的个数
- c语言:输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n
- 编程之美 2.7 最大公约数 扩展问题之逆转一个整数的二进制表示
- 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。
- 整数二进制表示中1的个数
- Amazon面试题 实现有符号整数的二进制表示法
- 28.整数的二进制表示中1的个数(运算)
- 快速计算整数的二进制表示法中1的个数