思路1,Java中有带符号右移,我们只要判断最后一位是否为1,进行统计即可。判断方法就是和 1 做与运算。
public int NumberOf1(int n) {
int count = 0;
while(n!=0){
count += n & 1;
n = n >>>1;
}
return count;
}
思路2:我把把1左移与原数字做与运算。这样我们就不用移动原数子了。只要判断当前的与结果是否不为0即可。但是缺点也很明显,32位全部都要判断。
public int NumberOf2(int n) {
int count = 0;
int falge = 1 ;
for(int i = 0 ; i < 32 ; i++){
if(falge== (n & falge)){
count++;
}
falge = falge << 1;
}
return count;
}
思路3:n 和 n-1 做与运算并赋值给n,只要当前 n 不等于0,那么我们就接着和 n-1 做与运算,直到 n 等于 0 为止,统计与操作的次数即可。
讲解一下这个原理,例如12,也就是1100,11的二进制为 1011
1100 & 1011 = 1000;1次
1000 & 0111 = 0000;2次;
例如31二进制为1111,30的二进制为1110;
1111 & 1110 = 1110;1次
1110 & 1101 = 1100;2次
1100 & 1011 = 1000;3次
1000 & 0111 = 0000;4次;
我们会发现只要n的二进制中有几个1,它就会做几次与运算,直到与运算的结果为0;
public int NumberOf1(int n) {
int count = 0;
while(n!=0){
n &= n-1;
count++;
}
return count;
}