LeetCode[191] - 计算二进制中1的个数

看了很多计算二进制中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);
    }

}

如有不对或是建议望指出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。