三种方法判断二进制中1的个数
2021-04-12 00:03
20 查看
余数方法(最简单,最易理解的算法):
#include <stdio.h> int main() { int i, n; int count = 0; scanf_s("%d", &n); while (n) { if (n % 2 == 1) { count++; } n = n / 2; } printf("%d\n", count); }
但是如果为负数结果就很难预料:
修改为无符号类型则可以解决这个问题:
#include <stdio.h> int can(unsigned int n) { int count = 0; while (n) { if (n % 2 == 1) { count++; } n = n / 2; } return count; } int main() { int i, n; int count = 0; scanf_s("%d", &n); i=can(n); printf("%d\n",i ); }
位操作方法(难度中):
通过移位操作和1作比较,将两个数进行位运算,结果位1则计数一次反正不执行。
#include <stdio.h> int main() { int i, a; int count = 0; scanf_s("%d", &a); for (i = 0; i < 32; i++) { if (((a >> i) & 1) == 1) { count++; } } printf("%d\n", count); }
通过一个算法判断程序执行次数推断1的个数:(执行效率最高)
#include <stdio.h> int main() { int i, n; int count = 0; scanf_s("%d", &n); while (n) { n = n & (n - 1); count++; } printf("%d\n", count); }
算法:n=n&(n-1):
输入:13
//1101 n 13
&
//1100 n-1 12
//1100 赋值给n 12
&
//1011 n-1 11
//1000 n 8
&
//0111 n-1 7
//0000
运算一次则让最右边少1,直到全为0为止就可以了。
注:本次程序在VS2019中测试。
相关文章推荐
- EOJ 1816 判断图连通的三种方法——dfs,bfs,并查集
- 1、写一个函数返回参数二进制中 1 的个数(三种方法)2、获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列3、输出一个整数的每一位。4、两个int(32位)整数m和n的二进制表达中,有多
- android判断网络连接状态的三种方法
- java中判断字符串是否为数字的三种方法
- java中判断是否为数字的三种方法
- Java三种判断字母大小写的方法
- 判断点是否处于多边形内的三种方法(转)
- jq判断checkbox是否选中的三种方法
- 三种方法实现求二进制中1的个数
- fn contains 包含字符串 三种方法判断
- java中判断字符串是否为数字的三种方法
- JS判断一个数组中是否有重复值的三种方法 .
- 【转载】Java多线程,判断其他线程是否结束的三种方法
- 判断一个数是否为素数的三种方法总结
- C#三种判断字符是否为汉字的方法
- Python 判断文件是否存在的三种方法
- Python判断文件是否存在的三种方法
- NSString字符串相加连接的三种方法、判断是否包含字符串的方法
- 判断一个整数是否是2整数次幂三种方法
- JS判断一个数组中是否有重复值的三种方法