剑指offer-二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

分析:

方法1:缺点:如果输入的是负数,整数一直做右移运算,会陷入死循环。

/**
     * 方法1:把整数与1做位与运算,如果结果为1,说明整数最右边一位是1,然后整数右移1位
     * 
     * @param n
     *            整形数据
     * @return 二进制中1的个数
     */
    public static int numberOf1(int n) {
        int count = 0; // 记录1的个数
        // int型占4个字节, 共32位
        for (int i = 0; i < 32; i++) {
            count += (n & 1);
            n >>= 1;
        }
        return count;
    }

方法2: 循环的次数等于整数的二进制位数

/**
     * 方法2:把整数与1做位与运算,然后将1左移1位
     * 
     * @param n
     *            整形数据
     * @return 二进制中1的个数
     */
    public static int numberOf2(int n) {
        int count = 0; // 记录1的个数
        // int型占4个字节, 共32位
        int flag = 1;
        for (int i = 0; i < 32; i++) {
            if ((n & flag) != 0)
                count++;
            flag <<= 1;
        }
        return count;
    }

方法3:整数中有几个1就循环几次(最优解)

/**
     * 方法3:把一个整数减去1,再与原整数做与运算,会把整数最右边的1变为0,那么一个整数的二进制中有多少个1就进行多少次这样的操作
     * 
     * @param n
     *            整形数据
     * @return 二进制中1的个数
     */
    public static int numberOf3(int n) {
        int count = 0; // 记录1的个数
        while (n != 0) {
            count++;
            n = n & (n - 1);
        }
        return count;
    }

类似题型:

  

原文地址:https://www.cnblogs.com/zywu/p/5767334.html