看了很多计算二进制中1的个数的算法,基本所有算法都是基于二进制的位运算,早上想了想,觉得可以换个简单的角度去想这个问题。
十进制转换二进制(正数)除二取余,根据这个转换方式我们就能计算出有多少个1
private int countPlus(int n) {
int count = 0;
while (n > 0) {
count += n % 2;
n = n / 2;
}
return count;
}
但这只是针对于正数,那么负数怎么算呢?负数转二进制是其绝对值除二取余取反加一,其实也就不难发现负数二进制与正数二进制的关系: -2是1的反码 -3是2的反码... 负数其实就是它绝对值减一再取反即 (-1) + (取反) = (取反)+(1)
那么负数二进制的1的个数也可以参考正数的方式。完整代码如下:
public class Count {
public int count(int n) {
return n >= 0 ? countPlus(n) : countMinus(n);
}
private int countPlus(int n) {
int count = 0;
while (n > 0) {
count += n % 2;
n = n / 2;
}
return count;
}
private int countMinus(int n) {
int count = 32;
n = -n - 1;
return count - countPlus(n);
}
}
如有不对或是建议望指出。