#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//统计十进制数中某个数字的个数时有 : %10 然后 /10 ;
//类比:统计二进制数字 1 的个数即 :%2 然后 /2 ;
int count_number_of_1(unsigned num)
{
//用 unsigned num 来接收是为了让负数的补码变为正数;
//比如:-1
// -1的补码: 1111 1111 1111 1111 1111 1111 1111 1111
// 用unsigned num接受后,1111 1111 1111 1111 1111 1111 1111 1111就变成一个正数的补码,
//则该正数的原码为1111 1111 1111 1111 1111 1111 1111 1111
//从而统计出 -1 中 1 的个数;
int count = 0;
while (num)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
return count;
}
//一位一位的慢慢对比
int count_number_of_2(num)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if ((num & 1) == 1)
{
count++;
}
num >>= 1;
}
return count;
}
//十分巧妙
int count_number_of_3(num)
{
int count = 0;
while (num)
{
num = num&(num - 1);
//经过这步计算之后,m 中最右边的 1 将被消除;
//比如:
// num=16 0001 0000
//num-1=15 0000 1111
// & 0000 0000
// count++;
// 循环结束,一共 1 个 1;
count++;
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = count_number_of_3(num);
printf("%d\n", ret);
return 0;
}