《剑指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

参考链接:

  • 【剑指Offer学习】【面试题10 :二进制中1 的个数】

你可能感兴趣的:(《剑指offer第二版》题15:二进制中1的个数)