1.最容易想到的就是 n&1 得到最后一位是不是 1 ,然后再将 n>>1 这样循环(int)32次就可以得到1的个数,但是这样n为负数时会陷入死循环
2.不如换一个思路设置一个 i ,每次让i>>1这样就不会对n进行修改,避免了死循环
public static int getNum3(int n) {
if(n == 0)
return 0;
int count = 0;
int i = 1;
while(i != 0){
if((n & i) == i)
count++;
i = i << 1;
}
return count;
}
3.n&(n-1) 每次都会将最右边的1 变成 0,利用这个特性
public static int getNum(int n) {
int count = 0;
while(n!=0) {
count++;
n = n & (n-1);
}
return count;
}
4.一个有趣的递归求解 正整数 1 的个数,
只能正整数N是偶数,那么n的二进制中1的个数与N/2中1的个数是相同的
奇数 N中1的位数等于N/2 +1 中的个数
public static int getNum2(int n) {
if(n<2)
return n;
return n%2+getNum2(n/2);
}
参考了
【0】整数的二进制中1的个数
【1】数据结构与算法分析