最基本的做法是不断的除以2,直到结果为0,这里做除法是一个比较耗时的操作。这里给出一个比较快速的算法(核心思想:去掉最低位的1):
代码1:
a不断地与自己的相反数-a按位相与(-a相当于a按位取反后加1),相当于排除最右边的1,然后直到该数变为0:
#include<stdio.h> int main() { int a, b; int count = 0; scanf("%d", &a); while(a) { count++; b = a & (-a);//最低位的1 a -= b; // 去掉了最低位的1 } printf("%d\n", count); }
代码2:
a不断地与(a - 1)按位相与,直至为0:
#include<stdio.h> int main() { int a, b; int count = 0; scanf("%d", &a); while(a) { count++; a &= (a -1); //去掉最低位的1 } printf("%d\n", count); }