余数方法(最简单,最易理解的算法):
#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中测试。