求二进制数中1的个数
来源:互联网 发布:易语言外网聊天室源码 编辑:程序博客网 时间:2024/05/16 19:51
方法1:除2取余法,主要缺点是只能计算正整数,对于负数不能计算(若输入一个负数,答案为0)。具体代码如下:
#include <stdio.h>#include <stdlib.h>int main(){int count_one_bits(int value);int v;printf("请输入一个整数:");scanf("%d", &v);count_one_bits(v);system("pause");return 0;}int count_one_bits(int value){int count = 0;int val = value;while (value != 0){if (value % 2 == 1)count++;value = value / 2;}printf("\n%d的二进制中1的个数为%d\n", val, count);return count;}
方法2:移位法,移位法有“右移”和“左移”,右移时负数补1、正数补0,而左移时正负数均补0.本代码程序中采用“右移法”。移位法的缺点是效率低下,比如对于-1而言,需要移位32次才能得到正确答案。具体代码如下:
#include <stdio.h>#include <stdlib.h>int main(){int count_one_bits(int value);int v;printf("请输入一个整数:");scanf("%d", &v);count_one_bits(v);system("pause");return 0;}int count_one_bits(int value){int count = 0;int val = value;int i = 32;while (i--){if (value & 1 ==1)count++;value = value>>1;}printf("\n%d的二进制中1的个数为%d\n", val, count);return count;}
方法3:按位“与”法,即x=x & (x-1),此算法效率高而且对于正负数均可。
比如15只需进行4次运算就能得到正确答案,15的8位二进制补码为00001111,下面为具体的过程:
0000 1111
减1 0000 1110
与运算 0000 1110 *****第一次******
减1 0000 1101
与运算 0000 1100 *****第二次******
减1 0000 1011
与运算 0000 1000 *****第三次******
减1 0000 0111
与运算 0000 0000 *****第四次******
进行了四次运算,得出15的二进制数有4个1.具体代码如下:
#include <stdio.h>#include <stdlib.h>int main(){int count_one_bits(int value);int v;printf("请输入一个整数:");scanf("%d", &v);count_one_bits(v);system("pause");return 0;}int count_one_bits(int value){int count = 0;int val = value;while (value){count++;value = value & (value-1);}printf("\n%d的二进制中1的个数为%d\n", val, count);return count;}
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中 1 的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- 求二进制数中1的个数
- “求二进制数中1的个数”
- 求二进制数中1的个数
- 求二进制数中1的个数
- C语言编程经验总结
- asp.net错误页
- 循环
- [DP] BZOJ 1270 [BeijingWc2008]雷涛的小猫
- 网页音乐盒
- 求二进制数中1的个数
- 制作日历
- 学生成绩管理系统
- 括号匹配问题
- 折半查找------在一个升序的有序数组中查找某个具体的数字
- 三子连珠游戏
- 全局变量 静态变量 局部变量分析
- 单链表的各种操作
- 替换字符串中的空格