一.题目
输入一个整数,输出该数的二进制表示中1的个数。
二.分析
1.可能引起死循环的解法
int NumberOf1(int n){
int count = 0;
while(n != 0){
if((n & 1) != 0){
count+;
}
n = n >> 1;
}
return count;
}
在实际编程中,除法的效率比移位运算要低的多。但如果上面输入一个负数如0x80000000,把该负数右移一位的时候,并不是简单的把最高位的1移动到第二位变成0x4000000,而是0xC0000000。这是因为移位前是负数,移位后要保证仍然是个负数,因此移位后的最高位会设为1.如果一直右移运算,最终这个数字会变成0xFFFFFFFF而陷入死循环。
2.常规解法
int NumberOf1(int n){
int count = 0;
int flag = 1;
while(flag != 0){
if((n&flag)!= 0){
count++;
}
flag = flag << 1;
}
return count;
}
这个解法的循环次数等于整数二进制的位数,32位的整数需要循环32次。下面介绍一种算法,整数中有多少个1就只需要循环几次
3.惊喜解法
int NumberOf1(int n){
int count = 0;
while(n != 0){
count++;
n = (n - 1)& n;
}
return count;
}