题解 | #二进制中1的个数#
二进制中1的个数
http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8
class Solution {
public:
int NumberOf1(int n) {
/*
//移位法
int val=n; // input data
int ans = 0;
int mark = 0x01;
while (mark != 0)
{
if (mark & val)
++ans;
mark <<= 1;
}
return ans;
*/
//技巧移位法
int ans=0;
while(n!=0)
{
if(n)
ans++;
n=n&(n-1);
}
return ans;
/*暴力法,运用数组存储二进制位
int loc[33]={0};
if(n>=0)
{
int i=31;
while(n>0)
{
loc[i--]=n%2;
n/=2;
}
}
else
{
loc[0]=1;
int n1=abs(n);
int i=31;
while(n1>0)
{
loc[i--]=n1%2;
n1/=2;
}
for(int j=1;j<=31;j++)
{
if(loc[j]==1)
loc[j]=0;
else
loc[j]=1;
}
for(int j=31;j>=1;j--)
{
if(loc[31]==0)
{
loc[31]=1;
break;
}
if(loc[j]==0)
{
loc[j]=1;
int k=j+1;
while(k<=31)
{
loc[k]=0;
k++;
}
break;
}
if(j==1&&loc[j]==1)
for(int k=1;k<=31;k++)
loc[k]=0;
}
}
int count=0;
for(int i=0;i<=31;i++)
if(loc[i]==1)
count++;
return count;
*/
}
};
public:
int NumberOf1(int n) {
/*
//移位法
int val=n; // input data
int ans = 0;
int mark = 0x01;
while (mark != 0)
{
if (mark & val)
++ans;
mark <<= 1;
}
return ans;
*/
//技巧移位法
int ans=0;
while(n!=0)
{
if(n)
ans++;
n=n&(n-1);
}
return ans;
/*暴力法,运用数组存储二进制位
int loc[33]={0};
if(n>=0)
{
int i=31;
while(n>0)
{
loc[i--]=n%2;
n/=2;
}
}
else
{
loc[0]=1;
int n1=abs(n);
int i=31;
while(n1>0)
{
loc[i--]=n1%2;
n1/=2;
}
for(int j=1;j<=31;j++)
{
if(loc[j]==1)
loc[j]=0;
else
loc[j]=1;
}
for(int j=31;j>=1;j--)
{
if(loc[31]==0)
{
loc[31]=1;
break;
}
if(loc[j]==0)
{
loc[j]=1;
int k=j+1;
while(k<=31)
{
loc[k]=0;
k++;
}
break;
}
if(j==1&&loc[j]==1)
for(int k=1;k<=31;k++)
loc[k]=0;
}
}
int count=0;
for(int i=0;i<=31;i++)
if(loc[i]==1)
count++;
return count;
*/
}
};