/*
28.整数的二进制表示中 1 的个数
题目:输入一个整数,求该整数的二进制表达中有多少个 1。
例如输入 10,由于其二进制表示为 1010,有两个 1,因此输出 2。
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
/*
其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0,
n-1与n相同除了最低位 n相当于在n-1的最低位加上1。
8(1000)= 7(0111)+ 1(0001),
所以8 & 7 = (1000)&(0111)= 0(0000),
清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。
再比如7(0111)= 6(0110)+ 1(0001),==>3
1:7 & 6 = (0111)&(0110)= 6(0110),
2:0110&0101=0100
3:0100&0011=0;
如果n的二进制表示中有k个1,那么这个方法只需要循环k次
*/
int count1(int n)
{
int c=0;
while (n!=0)
{
n=n&(n-1);
c++;
}
return c;
}
int count2(int n)
{
int c=0;
while(n)
{
if(n&1)
//if(n%2==1)
c++;
n =n>>1;
}
return c;
}
int main()
{
int n;
while(cin>>n)
{
printf("%d:其二进制中总共有%d个1,对是%d个1\n",n,count1(n),count2(n));
}
return 0;
}