代码如下:
int main()
{
int n=0;
scanf("%d",&n); //输入一个数字
int count =0; //计数器:用来统计1的个数
while(n)
{
n=n&(n-1); //此为核心
count++;
}
printf("%d",count); //打印统计到的1的个数
return 0;
}
核心代码的解释:
①假设n=15
(1)第一次操作
n: 00000000000000000000000000001111
n-1:00000000000000000000000000001110
对n和n-1进行按位与操作(&)
得到的结果为:00000000000000000000000000001110
与n相比,得到的结果中1的个数少了一个1。
(2)第二次操作
此时,n:00000000000000000000000000001110
计算n-1:00000000000000000000000000001101
对n和n-1进行按位与操作(&)
得到的结果为:00000000000000000000000000001100
与n相比,得到的结果中1的个数少了一个1。
.
.
.
因此,进行推论:每进行一次这样的操作,即可使n的二进制形式中少一个1。据此。我们可以通过while循环的形式进行统计,在抹除掉最后一个1的时候,n变为了0。因此while循环的条件可以设置为n。
②假设n=-1
(1)第一次操作
n:11111111111111111111111111111111
n-1:11111111111111111111111111111110
对n和n-1进行按位与操作(&)
得到的结果为:11111111111111111111111111111110
与n相比,也是减少了一个1。这与正数相一致。
综上所述:此代码对正数和负数都有效。