给定一个整数,判断其二进制表示中1的个数。
第一种比较直接的思路是
1. 把这个数的低位与1取与运算,
2. 再把这个数右移1位,
3. 返回1,
结果:统计这个过程中1的个数。
但这种思路存在一个局限,就是如果这个数是负数,那么符号位在右移的过程中仍旧是1,这样循环结束的条件不太好判断,而且,这也改变了输入的参数的n。
比较普遍适用的思路2是:用一个无符号数flag,从1开始,跟n取余,对结果进行比较,如果是1,则计数加1;然后让flag左移1。这样循环,直到flag循环为0时,则n的所有位数都已经比较过了,输出计数结果即可。代码如下:
//二进制中1的个数。解法1
//此种方法不论n为正数或者n为负数均可
int NumberOf1(int n){
int count = 0;
unsigned flag = 1;
while (flag){
if (n & flag)
count++;
flag <<= 1;
}
return count;
}
//二进制中1的个数。解法2
//此种方法不论n为正数或者n为负数均可
int NumberOf1(int n){
int count = 0;
while (n){
count++;
n = (n-1)&n;
}
return count;
}