跳至主要內容

二进制中1的个数

soulballad算法剑指Offer剑指Offer约 530 字大约 2 分钟

题目:

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

分析:

​ 实际考察位运算和二进制,把输入的数字转成二进制,每一位都 和 1 做与运算,如果结果等于1;说明当前位是1,否则是 0,然后可以统计出二进制中 1 的个数。

方案一:左移运算

​ 把数字往右移会出现死循环,那么可以考虑往左移,于是定义一个flag,从最小位开始,没判断一次,就往左移一位,直到flag与数字做与操作为0,说明数字的最大位都已经判断完了,因此结束循环,于是有下列代码

public static int getCountInNUm(int num) {
 
    int count = 0;
    int flag = 1;
    while (flag != 0) {
        if ((num & flag) != 0) {
            count++;
        }
        flag = flag << 1;
    }

    return count;
}

方法二:位与运算

​ 如果一个整数不等于0,那么该整数的二进制表示中至少有一位是1。
​ 假设最后一位不是0,那么减去1,最后一位变成0而其他所有位都保持不变,也就是最后一位相当于做了取反操作,由1变成了0。
​ 假设最后一位是0,如果该整数的二进制表示中最右边的1位于第m位,那么减去1时,第m位由1变成0,而第m位之后的所有0都变成1,整数中第m位之前的所有位都保持不变。
​ 把一个整数和它减去1的结果做位与运算,相当于把它最右边的1变成0。
​ 所以,这种方法,只要这个整数有几个1,就做几次这样的操作。
​ 综上,可以得到下列代码:

public static int getCount(int num) {
    int count = 0;
    while (num != 0) {
        count++;
        num = num & (num - 1);
    }
    return count;
}
上次编辑于:
贡献者: soulballad