You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java统计数字二进制表示中1的个数问题详解(DS&A入门)

统计数字二进制表示中1的个数(Java实现详解)

方法一:逐位检查(最易理解)

思路直白:每次判断数字最后一位是否为1,然后将数字无符号右移一位,重复操作直到数字变为0。

Java代码示例:

public class CountOneBits {
    public static int countOnes(int n) {
        int count = 0;
        while (n != 0) {
            // 最后一位和1按位与,结果为1说明最后一位是1
            if ((n & 1) == 1) {
                count++;
            }
            // 无符号右移,避免负数补1导致死循环
            n = n >>> 1;
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(countOnes(5)); // 5的二进制是101,输出2
        System.out.println(countOnes(-3)); // -3的补码含31个1,输出31
    }
}

解释:

  • n & 1:按位与操作,仅当n最后一位为1时返回1,否则返回0。
  • n >>> 1:无符号右移,无论正负左边都补0,避免负数用>>右移时一直补1导致死循环。

方法二:高效技巧(利用n & (n-1))

核心原理:n与n-1按位与,会消除n最右侧的1。比如n=5(101),n-1=4(100),5&4=4(100),最右侧的1被消除;再执行4&3=0,共操作2次,对应2个1。

Java代码示例:

public class CountOneBits {
    public static int countOnes(int n) {
        int count = 0;
        while (n != 0) {
            count++;
            // 消除最右侧的1
            n = n & (n - 1);
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(countOnes(5)); // 输出2
        System.out.println(countOnes(-3)); // 输出31
    }
}

解释:

  • 循环次数等于数字中1的个数,比逐位检查效率更高,尤其当1的数量较少时。
  • 负数同样适用,因为Java中负数以补码存储,该操作对补码同样有效。

方法三:Java内置方法

Java提供了现成的工具方法,直接调用即可:

int count = Integer.bitCount(n);

该方法底层基于n & (n-1)的高效逻辑实现,适合快速开发场景。

内容的提问来源于stack exchange,提问作者Tech Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:15:43