long.bitcount() 是 java 中计算 long 类型二进制表示中 1 的个数的高效 o(1) 方法,基于分治算法实现,适用于状态压缩 dp、子集枚举等场景,需注意 long 与 int 类型区分及字面量后缀。

Long.bitCount() 是 Java 中一个高效、内置的位运算工具方法,专用于计算 long 类型(64 位)整数的二进制表示中 1 的个数(即汉明重量,Hamming Weight)。它底层基于优化的分治算法(类似 SWAR 技术),时间复杂度为 O(1),比手动循环移位或查表更简洁可靠,非常适合在算法题中快速使用。
直接调用,零成本获取 1 的个数
无需自己实现 Brian Kernighan 算法或打表,一行代码即可完成统计:
- // 示例:统计 0x1F(即 31)的二进制中 1 的个数 → 5
int cnt = Long.bitCount(31L); // 返回 5- // 支持负数(按补码解释):-1 的二进制是 64 个 1
Long.bitCount(-1L); // 返回 64
配合位掩码与位运算加速状态压缩题
在状态压缩 DP、子集枚举(如「数组所有子集的异或和」、「最小路径覆盖」)等题目中,常需频繁判断状态中开启的位数(即子集大小)或筛选特定 popcount 的状态:
- 枚举所有长度为 n 的子集时,用
if (Long.bitCount(mask) == k)快速筛选大小为 k 的子集 - DP 状态转移中,若需按“已选元素个数”分层,可用 bitCount 作为维度索引,避免额外维护计数变量
- 例如:LeetCode 1178「猜字谜」中,可预处理每个单词的 bitset(a–z 映射到 0–25 位),再用
bitCount(mask & puzzleMask) == 1判断是否只含谜底首字母
注意 long 类型与 int 的边界区分
虽然 Integer.bitCount() 同样高效,但务必匹配数据类型:
- 输入是 int 时,用
Integer.bitCount(x)—— 它只看低 32 位,高位补 0 - 输入是 long 或可能超过 32 位(如状态压缩用到 40+ 位),必须用
Long.bitCount(x),否则高位被截断导致错误 - 常见陷阱:
Long.bitCount(0xFFFFFFFF)返回 32(因为 0xFFFFFFFF 是 int 字面量,自动扩展为 long 后仍是低 32 位全 1),而Long.bitCount(0xFFFFFFFFL)才明确表示 32 个 1;若要表示 64 个 1,应写-1L或0xFFFFFFFFFFFFFFFFL
不依赖 JDK 实现,但需知其稳定可靠
从 JDK 1.5 起该方法就存在,OpenJDK 中实际调用的是基于 0x5555555555555555L、0x3333333333333333L 等掩码的常数时间位操作,经 JIT 编译后常被内联为几条 CPU 指令(如 POPCNT 指令,若硬件支持)。在算法竞赛或笔试中可放心使用,无需担心性能或兼容性问题。










