题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法
方法(1)
对于二进制各个位数进行辨别。首先需要判断n是不是负数,当n为负数的时候,直接用while循环判断会导致死循环,因为负数向左移位的话最高位补1 。针对这种情况,要不就是对正数和负数的操作应该分开处理,要不就是找到一个对正数和负数都可以处理的方法。可以使用判别数进行移位。
int NumberOf1(int n)
{
int count = 0;
int a = 1;
while (a != 0)
{
if (n & a)
count++;
a=a <<1;
}
return count;
}
也可以把int型转成二进制的string类型,再统计string类型中1的个数。这样正数和负数就都可以处理了。这里需要用到bitset和string头文件;
#include<string>
#include<bitset>
int NumberOf1(int n)
{
int count = 0;
bitset<32> b(n);
string s = b.to_string();
//cout << s << endl;
for (string::iterator it = s.begin(); it != s.end(); it++)
if (*it == '1