解法一:
首先把i和1做与运算,判断I的最低位是不是为1。接着把1左移一位得到2,在和i做与运算,就能判断i的此地为是不是1…这样反复左移,每次都能判断i的其中一位是不是1。代码如下:
int NumberOf1(int n)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (n&flag)//判断第flag位是不是1
count++;
flag = flag << 1;//将flag位左移一位
}
return count;
}
解法二:
把一个整数减去1,在和原证书做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次操作。大大减少了循环次数。代码如下:
int NumberOf1_2(int n)
{
int count = 0;
while (n)
{
++count;
n = n&(n - 1);
}
return count;
}