计算二进制中 1 的个数

发布于 2024-06-29 07:47:59 字数 1948 浏览 25 评论 0

题目描述

输入一个 32 位整数,输出该数二进制表示中 1 的个数。

注意

  • 负数在计算机中用其绝对值的补码来表示。

样例 1

输入:9
输出:2
解释:9 的二进制表示是 1001,一共有 2 个 1。

样例 2

输入:-2
输出:31
解释:-2 在计算机里会被表示成 11111111111111111111111111111110,
      一共有 31 个 1。

解法

解法一

利用整数 1,依次左移每次与 n 进行与运算,若结果不为 0,说明这一位上数字为 1,++cnt。

此解法 i 需要左移 32 次。

不要用 n 去右移并与 1 进行与运算,因为 n 可能为负数,右移时会陷入死循环。

class Solution {

    /**
     * 求二进制中 1 的个数
     *
     * @param n 整数
     * @return 该整数的二进制中 1 的个数
     */
    public int NumberOf1(int n) {
        int i = 1;
        int cnt = 0;
        while (i != 0) {
            if ((n & i) != 0) {
                ++cnt;
            }
            i <<= 1;
        }
        return cnt;
    }
}

解法二(推荐)

运算 (n - 1) & n ,直至 n 为 0。运算的次数即为 n 的二进制中 1 的个数。

因为 n-1 会将 n 的最右边一位 1 改为 0,如果右边还有 0,则所有 0 都会变成 1。结果与 n 进行与运算,会去除掉最右边的一个 1。

举个栗子:

若 n = 1100,
n - 1 = 1011
n & (n - 1) = 1000

即:把最右边的 1 变成了 0。

把一个整数减去 1 之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中最右边的 1 变成 0。很多二进制的问题都可以用这种思路解决。

class Solution {

    /**
     * 求二进制中 1 的个数
     *
     * @param n 整数
     * @return 该整数的二进制中 1 的个数
     */
    public int NumberOf1(int n) {
        int cnt = 0;
        while (n != 0) {
            ++cnt;
            n &= (n - 1);
        }
        return cnt;
    }
}

解法三

利用 Java API。

class Solution {

    /**
     * 求二进制中 1 的个数
     *
     * @param n 整数
     * @return 该整数的二进制中 1 的个数
     */
    public int NumberOf1(int n) {
        return Integer.bitCount(n);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

微凉

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文