java中仅byte、short、int、long、char五种整数类型支持位统计,float/double/boolean不支持;需注意类型提升与符号扩展,推荐优先使用integer.bitcount()和long.bitcount()。

Java 基本数据类型本身不提供“位统计”(即统计二进制中 1 的个数)的直接语法,但可通过位运算在整数类型(byte、short、int、long、char)上高效实现。关键前提是:只有整数类型能参与位操作,且需注意类型提升与符号扩展影响。
哪些类型支持位统计
仅以下五种基本类型可安全用于位统计运算:
-
int:最常用,32 位,有符号,
Integer.bitCount(n)内置支持 -
long:64 位,用
Long.bitCount(n) -
short 和 byte:运算前自动提升为
int,需先转为无符号形式再统计(如Byte.toUnsignedInt(b)) -
char:无符号 16 位,可用
Character.codePointAt(new char[]{c}, 0)或直接转int后调用bitCount
float/double/boolean 不支持位统计运算——它们不能直接参与 &、|、^ 等操作;若需分析其位模式,须先用 Float.floatToIntBits() 或 Double.doubleToLongBits() 转为对应整型。
手动实现位统计的常用方法
不依赖内置 API 时,可用以下经典算法(适用于 int 或 long):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
逐位检查法:用
n & 1判断最低位,再n >>= 1右移,循环直到为 0(注意负数用>>>避免死循环) -
清除最低位 1 法(Brian Kernighan):
n & (n - 1)每次清除一个最低位的 1,执行次数即为 1 的个数,效率更高 - 查表法(预计算):对 byte 分段查 256 元素表,适合高频批量处理
示例(Brian Kernighan):
int count = 0;
int n = 0b1011001; // 7 个 1?
while (n != 0) {
n = n & (n - 1);
count++;
}
处理小类型(byte/short)的注意事项
直接对 byte b = -1 调用 Integer.bitCount(b) 会得到 32(因 b 被提升为 int 后是 0xFFFFFFFF)。正确做法是:
- 转为无符号等效值:
Integer.bitCount(Byte.toUnsignedInt(b))→ 得 8 - 或掩码截断:
Integer.bitCount(b & 0xFF) -
short同理:Integer.bitCount(s & 0xFFFF)
实际应用场景
位统计不是炫技,而是解决具体问题:
- 计算权限掩码中启用的功能数(如用户拥有 READ | WRITE | EXEC → bitCount = 3)
- 哈希一致性校验(如布隆过滤器中统计 hash 位集密度)
- 图像处理中统计像素位平面的活跃度
- 算法题中判断“汉明重量”(Hamming Weight)
Java 标准库已对 int 和 long 提供高度优化的 bitCount 实现(基于分治位操作),优先使用比手写更快更可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










