#include<iostream>
using namespace std;
int main()
{
long n;//原始长整型值
unsigned long m;//类型转化后存放
while (cin >> n)
{
unsigned int i = 0;//用于累加计算二进制1的个数
m = (unsigned long)n;
while (m != 0)
{
//循环判断最低位是否是1,并逻辑右移一位(高位补0)
i += m & 1;
m = m >> 1;
}
cout << i << endl;
}
return 0;
}
注:1、由于整数包含有符号和无符号两种类型,在使用右移运算符时会出现算数右移和逻辑右移。
2、整数都是以补码的形式存在内存中,例:-3->FFFFFFFD,3->00000003
3、我的思路是将所有数强制类型转化,看成是无符号的,则可以将>>作为逻辑右移使用。
本文在笔试后重新思考后写的代码,因而未经过大量测试,纯属抛砖引玉,欢迎各位批评指正,相互学习!