//题目:写一个函数返回参数二进制中的1的个数//比如:15000011114个1//程序原型:intcount_one_bit(unsignedintvalue)//{////返回1的个数//}#include<stdio.h>#include<stdlib.h>intcount_one_bit(unsignedintvalue){intcount=0;intn;while(n){if(n%2==1)count++;n=n/2;}returncount;}intmain(){intn=0;intret=0;scanf("%d",&n);ret=count_one_bit(n);printf("%d\n",ret);system("pause");return0;}

运行结果:



上面是第一种实现方法,用模2、除2的方法将数字进一步的统计二进制1的个数


除此之外还可以用通过for循环来使数字在计算器中移位比特位的方法,如下:

//00000000000000000000000000001111//00000000000000000000000000000001//00000000000000000000000000000111//数字进入循环后右移0位,与1后为1,统计一个1,i加1,一步一步循环统计for(i=0;i<32;i++){if(((n>>i)&1)==1)count++;}


这道题我们让n和比它小1的数字相与,举一些例子我们就不难发现,每次相与之后的数字的二进制就比n的二进制数字少一个1,并且每次都是少最右边的那个1,因此我们还可以用这个方法来统计参数二进制1的个数:

while(n){count++;//当参数能够进入while循环时,说明条件为真,它当中至少有一个1,所以先统计,//否则统计结果会少一个1n=n&(n-1);}


到这儿,可能细心的人会发现,如果以上程序输入-1时,程序是无法执行的,因为我们给出的原型中是无符号整型,变量的最小范围是0到65535,而整型的变量的最小范围为-32767到32767,要想正确统计-1的二进制1,只要将函数形参改成 int n 就可以了(只适用上面与或者移位运算的模块程序)



如有补充,尽情评论指教