题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
分析:
思路就是先将输入的整数的绝对值的原码求出来放在一个数组中,如果输入的整数是正数,那么在这个数组中所存储的1的个数就是结果,如果输入的整数是个负数,按照负数的补码等于源码从低位开始寻找到第一个1将之前的按位取反直至符号位,在此过程中顺带求出1的个数。
实现:
class Solution {
public:
int NumberOf1(int n) {
if(n==0)
{
return 0;
}
int n1=n,num=0,i,id;
vector <int> v;
if(n1<0)
{
n1=-n1;
}
while(n1)
{
v.push_back(n1%2);
n1 = n1/2;
}
if(n>0)
{
for(i=v.size()-1;i>=0;i--)
{
if(v[i]==1)
{
num += 1;
}
}
}
if(n<0)
{
if(n==0-pow(2,31))//特殊性
{
return 1;
}
num += 32-v.size();
for(i=0;i<v.size();i++)
{
if(v[i]==1)//复数的补码为源码取反+1
{
num += 1;
//id = i;
break;
}
}
for(int j=i+1;j<v.size();j++)
{
if(v[j]==0)
{
num += 1;
}
}
}
return num;
}
};
finished!!!