剑指offer的解题思路:
class Solution {
public:
int NumberOf1(int n) {
int count =0;
while(n)
{
++count;
n=(n-1)&n;
}
return count;
}
};
解题思路:
先判断是正数还是负数,如果是正数 将数转化成二进制数1的个数即可。
如果是负数,求其相反数的二进制表示,然后除符号位各位取反 末尾加1.
class Solution {
public:
int NumberOf1(int n) {
if(n>=0)
{
int one_num=0;
while(n!=0)
{
if(n%2==1)
one_num++;
n/=2;
}
return one_num;
}
else{
n=0-n;
int arr[32]={0};
for(int i=0;n!=0;++i)
{
arr[i]=n%2?1:0;
n/=2;
}//求其相反数的二进制表示法。
for(int i=0;i<32;++i)
{
arr[i]=arr[i]?0:1;
}//各位取反
if(arr[0]==0){
arr[0]=1;
}//末尾加一
else{//需要进位
int i=0;
while(arr[i]!=0&&i<31)
{
arr[i]=0;
i++;
}
arr[i]=1;
}
int one_number=0;
for(int i=0;i<32;++i)//统计数组中1的个数
{
one_number=arr[i]?one_number+1:one_number;
}
return one_number;
}
}
};