二进制中1的个数
二进制中1的个数
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
sample input:
10
sample output:
2
常规解法:
十进制转二进制,遍历计算二进制中1的个数。
int solve(int n){
int cnt=0;
while(n){
if(n%2) cnt++;
n/=2;
}
return cnt;
}
这种方法,对于大部分数据是对的,但是对于-2147483648,二进制为1000...000,一共有31个0.因为计算机使用补码存储二进制数据的。对于这个数据,该程序输出0,实际上为1.所以这种方法不对。
二进制移位法(有问题)
int solve(int n){
int cnt = 0;
while(n){
if(n&1) cnt++;
n >>= 1;
}
return cnt;
}
二进制思想:
对于一个数n和n-1对应二进制中,n的高位向低位最后一个1(低位向高位第一个1),在减1后,这个1变为0,之前的位不变,之后的位0->1,1->0.n&(n-1)按位与后,1前面的不变,后面的全变为0.
通过按位与我们可以很好地通过循环计算1的个数。而且不用判断0,会在n&(n-1)的过程中自动忽略,不需要按照位来遍历判断。
int solve(int n){
int cnt=0;
while(n){
cnt++;
n &=(n-1);
}
return cnt;
}
T(时间复杂度):O(n)
S(空间复杂度):O(1)
流转星云