代码如下:
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。这与正数相一致。
综上所述:此代码对正数和负数都有效。









