第一种思路:
使用一个for循环,将32位数依次和 1 进行与运算,假设n=15,n的二进制数为1111(只写了4位), 1111 & 0001 = 0001;若n=14,其二进制数为1110, 1110 & 0001 = 0000,所以只要用if条件判断真假即可使用count记下1的个数。
#includeint NumberOf1(int n) { int count = 0; int i = 0; for(i=1;i<=32;i++) { //1111 & 0001 = 0001 if (((n >> i) &1) == 1) count++; } return count; } int main() { //求二进制中 1 的个数 int a = -1; printf("%d", NumberOf1(a)); return 0; }
思路二:
使用 n = n & (n-1)
设 n = 15 二进制为 1111
1111 & (1111 - 0001) = 1110;
1110 & (1110 - 0001) = 1100;
1100 & (1100 - 0001) = 1000;
1000 & (1000 - 0001) = 0000;
n = n & (n-1)每执行一次便少一个 1 (会丢弃掉二进制中最右边的一个 1 ),这样只要使用while循环判断n是否为零即可使用count计数
#includeint NumberOf1(int n) { int count = 0; int i = 0; while (n) { n = n & (n - 1); count++; } return count; } int main() { //求二进制中 1 的个数 int a = 14; printf("%d", NumberOf1(a)); return 0; }
输入-1也可得到32,思路一容易想到,思路二更为简洁但难想得到,还望多加学习并使用。


![[C语言]求一个数的二进制中 1 的个数 [C语言]求一个数的二进制中 1 的个数](http://www.mshxw.com/aiimages/31/766889.png)
