基本思路:先判断整数二进制表示中最右边是不是1,接着把输入的整数右移一位,在判断最右是不是1,直到整个整数变为0为止。
int NumberOf1(int n)
{
int count=0;
while(n)
{
if(n&1)
count++;
n=n>>1;
}
return count;
}
为了避免死循环,可以不进行右移i.首先把i和1做与运算,判断i的最低位是不是为1,接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1,。。。。。。。。。。
int NumberOf1_Solution1(int n)
{
int count = 0;
unsigned int flag = 1;
while(flag)
{
if(n & flag)
count ++;
flag = flag << 1;
}
return count;
}
还有一种更优的解法:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
int NumberOf1_Solution2(int n)
{
int count = 0;
while (n)
{
++ count;
n = (n - 1) & n;
}
return count;
}