一、方法定义

Long.bitCount(long i)java.lang.Long 类的 静态方法,用于计算一个 long 类型数值的二进制表示中 1 的个数(也称为 汉明重量,Hamming Weight)。

方法签名:

public static int bitCount(long i)
  • 参数i - 要计算的 long 值(64位有符号整数)。
  • 返回值:一个 int,表示该数值二进制形式中 1 位的数量。
  • 无异常抛出:该方法是安全的,不会抛出任何异常。

二、功能说明

  • 计算二进制中 1 的个数:将输入的 long 值视为 64 位二进制数,统计其中值为 1 的位数。
  • 支持负数:负数以补码(Two's Complement)形式存储,方法会正确计算其二进制表示中的 1
  • 高效实现:JVM 通常会将其优化为底层 CPU 指令(如 x86 的 POPCNT),性能极高。
  • 常用于算法场景:如位运算优化、状态压缩、布隆过滤器、汉明距离计算等。

三、示例代码

示例 1:基本用法

long num = 7; // 二进制: 111
int count = Long.bitCount(num);
System.out.println(count); // 输出: 3

示例 2:计算负数中 1 的个数

long negative = -1; // 所有64位都是1
int count = Long.bitCount(negative);
System.out.println(count); // 输出: 64

long minusTwo = -2; // 补码: 111...110 (63个1)
System.out.println(Long.bitCount(minusTwo)); // 输出: 63

示例 3:零和正数

System.out.println(Long.bitCount(0));        // 0
System.out.println(Long.bitCount(1));        // 1 (二进制: 1)
System.out.println(Long.bitCount(8));        // 1 (二进制: 1000)
System.out.println(Long.bitCount(15));       // 4 (二进制: 1111)

示例 4:大数与十六进制表示

long hex = 0xABC123L;
System.out.println(Long.bitCount(hex)); // 输出: 11 (可自行验证)

四、使用技巧

  1. 判断是否为 2 的幂
    一个正数是 2 的幂,当且仅当 bitCount(n) == 1

    boolean isPowerOfTwo(long n) {
        return n > 0 && Long.bitCount(n) == 1;
    }
    
  2. 计算汉明距离(两个数不同位数)
    两个数的异或结果中 1 的个数即为汉明距离。

    int hammingDistance(long a, long b) {
        return Long.bitCount(a ^ b);
    }
    
  3. 统计集合大小(位图表示)
    若用 long 的每一位表示集合元素是否存在,bitCount 可快速得到集合大小。

    long bitmap = 0b1011; // 表示 {0,1,3}
    int setSize = Long.bitCount(bitmap); // 3
    
  4. 奇偶性判断
    bitCount(n) % 2 == 0 可判断 1 的个数是偶数还是奇数(用于校验位等)。


五、常见错误与误解

误解 1:bitCount(-1) 是 1
✅ 实际上 -1 的补码是 64 个 1,所以 bitCount(-1) == 64

误解 2:只适用于正数
✅ 方法对负数完全支持,基于补码计算。

误解 3:计算的是 0 的个数
✅ 它计算的是 1 的个数。若需 0 的个数,可用:64 - Long.bitCount(i)


六、注意事项

  • 返回类型是 int:虽然 long 有 64 位,但最多 64 个 1int 足够表示。
  • 符号不影响计算逻辑:无论正负,都按 64 位二进制补码计算。
  • 性能极高:现代 JVM 会将其编译为单条 CPU 指令(如 POPCNT),接近常数时间 O(1)
  • 无边界检查:传入任何 long 值都安全,不会抛异常。

七、最佳实践

推荐场景

  1. 位运算密集型算法:如状态压缩 DP、枚举子集等。
  2. 性能敏感计算:替代手动循环移位统计 1 的个数。
  3. 集合操作优化:用位图 + bitCount 实现快速计数。
  4. 数据校验与编码:如计算校验和、汉明码等。

不推荐替代方案

// ❌ 低效:手动循环
int count = 0;
long n = num;
while (n != 0) {
    count += n & 1;
    n >>>= 1;
}

// ✅ 高效:直接使用
int count = Long.bitCount(num);

八、性能优化

方法 性能 说明
Long.bitCount(n) 极高 JVM 优化为 CPU 原生指令
手动位移循环 🐢 慢 需要最多 64 次操作
转字符串统计 '1' 🐌 极慢 字符串开销大

🔍 性能对比(典型)
bitCount() 比手动循环快 10~50 倍,尤其在高频调用时优势明显。


九、总结

Long.bitCount(long) 是 Java 中一个 高效、安全、实用 的位操作工具方法,用于快速统计 long 值中 1 位的数量。

✅ 核心要点:

项目 说明
功能 统计 long 二进制中 1 的个数(汉明重量)
性能 极高,通常映射为 CPU 原生指令
适用范围 正数、负数、零均支持
返回值 int 类型,范围 0~64
典型用途 位运算、集合计数、汉明距离、算法优化

🚀 实践口诀:

要数 1 几个?bitCount 一秒搞定;负数补码也支持,算法提速全靠它。