题目描述
输入一个整数,输出该数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
本文介绍了两种计算32位整数二进制表示中1的个数的方法。第一种方法通过位运算逐位检查,第二种方法利用n与n-1的位运算特性更高效地计算。提供了详细的代码实现及性能对比。
1118

被折叠的 条评论
为什么被折叠?



