算法编程(十五):位1的个数

109 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

写在前面

今天的这道题,《位1的个数》,是一个关于进制的题目。

要解出这道题,你需要具备对二进制的基本理解,并且能获取到每一位的二进制的数值。

下面就一起来看一下如何解答吧。

image.png

题目解读

从题目的标题来看,就大概知道要统计1出现的个数。

再从题目的描述来看,就知道是统计二进制数字的1出现的个数。

那么问题来了,要统计1出现的个数。

就必须拿到二进制每一位的值才行,这样才能进行有效的比对。

那么如何拿到每一位的值呢?

当然如果是十进制的话,可以使用取余10的方式来提取每一位的值。

但是二进制的肯定是不能取余10,那就取余2吧。

这里就要使用位运算了,通过这种方式拿到每一位的值后。

就可以进行判断统计了。

接下来就看一下代码实现吧。

代码实现

代码执行如下,大家可以自行参考一下。

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int total = 0;
        for (int i = 0; i < 32; i++) {
            if ((n & (1 << i)) != 0) {
                total++;
            }
        }
        return total;
    }
}

代码执行结果

本次代码执行的一般,内存消耗太严重,还是要考虑一下内存问题。

image.png

其他思路

还有一种更随便的方式,那就是直接使用Java提供的内置方法bitCount方法。代码如下:

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        return Integer.bitCount(n);
    }
}

执行结果:

竟然比上面的那种还要快,气不气!

image.png

总结

今天的总结就是搞清二进制,并且能熟练的提取二进制每一位的值即可解出此题。