题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
求解思路1
我们可以设置一个无符号整数1
,从低位往高位(1-32
)一直移动,然后与整数对应位置的数字进行比较(与运算),来实现计算1
的个数,代码如下:
class Solution {
public:
int NumberOf1(int n) {
int count=0;
unsigned int flag=1;
while(flag){
if(n&flag){
count++;
}
flag<<=1;//左移一位
}
return count;
}
};
运行时间:3ms
占用内存:484k
求解思路2
一个非0
的数n
减去1
的值我们计为tmp
,则n
与tmp
与运算后会得到下一个出现1
的位置,我们将运算的结果赋给n
,重新计算,这样的话有多少个1
我们就计算多少次,而不是像思路1
中的计算32
次
如四位二进制1000
表示8
,而8-1
的四位二进制表示为0111
,它们与运算的结果为0
,因此,8
的二进制中只有1
个1
,代码如下:
class Solution {
public:
int NumberOf1(int n) {
int count=0;
while(n){
count++;
n=(n-1)&n;
}
return count;
}
};
运行时间:2ms
占用内存:484k