Integer.bitCount() 是 Java 中高效计算 int 二进制补码中 1 的个数(汉明重量)的方法,底层用优化位操作或 CPU popcnt 指令实现,比循环、字符串等手动方式更快更省内存。

Integer.bitCount() 是 Java 中一个高效、内置的位运算方法,专门用于计算一个 int 类型整数的二进制补码表示中 **1 的个数**(也叫“汉明重量”,Hamming weight)。它底层使用了经过高度优化的位操作算法(如 SWAR 或查表+分治),比手动循环移位或转字符串统计快得多,且无需额外空间。
为什么 bitCount() 比手写循环更快?
它不依赖分支判断或字符串转换,而是通过一系列位掩码与位移组合,分步统计每几位中的 1 的数量,最终合并结果。例如:
- 先两两分组:
(n & 0x55555555) + ((n >> 1) & 0x55555555)→ 得到每 2 位中 1 的个数 - 再四四合并、八八合并……直到得到整个 32 位的总数
- JVM 还可能在支持时直接映射为 CPU 的
popcnt指令(如 x86 的 POPCNT 指令),单周期完成
怎么用?直接传入 int 即可
无论正数、负数、零,都按 32 位补码解释:
-
Integer.bitCount(0)→ 0 -
Integer.bitCount(7)→ 3(7 =0b111) -
Integer.bitCount(-1)→ 32(-1 的补码是 32 个 1) -
Integer.bitCount(0b10101010)→ 4
注意:只适用于 int,其他类型需转换
如果处理的是 long,用 Long.bitCount();byte 或 short 需先提升为 int(自动符号扩展),若想按无符号字节统计(0~255),可先与 0xFF 按位与:
-
Integer.bitCount(b & 0xFF)→ 正确统计 byte 的 8 位中 1 的个数 - 错误写法:
Integer.bitCount(b)(负 byte 会符号扩展出多余 1)
替代方案对比(不推荐但需知道)
虽然 bitCount() 是最优解,但了解常见低效写法有助于避开坑:
- 转字符串:
Integer.toBinaryString(x).replace("0", "").length()—— 创建对象、遍历、GC 开销大 - 循环右移:
while (n != 0) { count += n & 1; n >>>= 1; }—— 最坏要 32 次迭代,且有分支 - 清除最低位 1:
while (n != 0) { n &= n - 1; count++; }—— 效率尚可(只循环 1 的个数次),但仍不如 native 实现
它不是黑魔法,而是把位运算技巧封装成了开箱即用的工具。只要你在统计 1 的个数,优先调用 Integer.bitCount() 就对了。

















