一、方法定义
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 (可自行验证)
四、使用技巧
判断是否为 2 的幂
一个正数是 2 的幂,当且仅当bitCount(n) == 1
。boolean isPowerOfTwo(long n) { return n > 0 && Long.bitCount(n) == 1; }
计算汉明距离(两个数不同位数)
两个数的异或结果中1
的个数即为汉明距离。int hammingDistance(long a, long b) { return Long.bitCount(a ^ b); }
统计集合大小(位图表示)
若用long
的每一位表示集合元素是否存在,bitCount
可快速得到集合大小。long bitmap = 0b1011; // 表示 {0,1,3} int setSize = Long.bitCount(bitmap); // 3
奇偶性判断
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 个1
,int
足够表示。 - 符号不影响计算逻辑:无论正负,都按 64 位二进制补码计算。
- 性能极高:现代 JVM 会将其编译为单条 CPU 指令(如
POPCNT
),接近常数时间O(1)
。 - 无边界检查:传入任何
long
值都安全,不会抛异常。
七、最佳实践
✅ 推荐场景:
- 位运算密集型算法:如状态压缩 DP、枚举子集等。
- 性能敏感计算:替代手动循环移位统计
1
的个数。 - 集合操作优化:用位图 +
bitCount
实现快速计数。 - 数据校验与编码:如计算校验和、汉明码等。
✅ 不推荐替代方案:
// ❌ 低效:手动循环
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
一秒搞定;负数补码也支持,算法提速全靠它。”