《剑指offer第二版》题15:二进制中1的个数

题目:请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001 ,有2位是1。因此如果输入9,则该函数输出2。

解题思路:

最简单的方式,将数字与1相与判断是不是1,然后将数字每次右移一位然后再次与1相与。

注意:正整数二进制表示最高位是0,负整数二进制表示最高位是1。如果是负数的话,一直右移那么与1相与一直是1。怎么办呢?在Java中int是32位,我们只需要右移32次就可以了。

/**
 * @param n
 * @return 数字二进制表示中1的个数
 */
public static int numberOfOne(int n) {
    int result = 0;
    for (int i = 0; i < 32; i++) {
        result += (n & 1);
        /**
         * 这里用带符号右移和无符号右移都可以,因为循环移动32次就结束了,不会出现死循环的问题。
         */
        n >>= 1;
    }
    return result;
}

测试用例

/**
 * -5在计算机中用补码表示是 1111 1111 1111 1111 1111 1111 1111 1011
*/
System.out.println(numberOfOne(-5));
System.out.println(numberOfOne(5));

输出结果

31
2

参考链接:

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

推荐阅读更多精彩内容