integer.numberoftrailingzeros() 返回int二进制末尾连续0的个数,范围0–32;输入0返回32,负数按补码计算;常用于判断2的幂、快速右移对齐及哈希优化,性能高且jvm内联。

Integer.numberOfTrailingZeros() 是 Java 中一个高效、内置的位运算工具方法,用于直接返回一个 int 值二进制表示中**从最低位(LSB)开始连续 0 的个数**。它不计算所有 0,只算末尾连续的 0,直到遇到第一个 1 为止;若输入为 0,则返回 32(因为 int 是 32 位,全零自然有 32 个尾随零)。
理解“尾随零”的含义
例如:
-
8的二进制是1000→ 尾随零个数为 3 -
6的二进制是110→ 尾随零个数为 1(末位是 0,但倒数第二位是 1) -
7的二进制是111→ 尾随零个数为 0(末位就是 1) -
0→ 返回 32(Java 规定:全零时返回位宽)
基本用法与示例代码
直接传入 int 类型变量或字面量即可:
int x = 16; // 10000₂ int zeros = Integer.numberOfTrailingZeros(x); // 返回 4 <p>int y = -1; // 所有位都是 1(补码),即 0xFFFFFFFF int z = Integer.numberOfTrailingZeros(y); // 返回 0 </p>
注意:该方法对负数也有效,按补码形式计算(如 -1 全为 1,所以尾随零为 0;-2 补码末位为 0,倒数第二位为 1,故返回 1)。
常见用途与实用场景
这个方法常用于底层优化和位操作逻辑中:
-
判断是否为 2 的幂次:非零整数
n是 2 的幂 ⇔n & (n - 1) == 0,等价地也可用Integer.bitCount(n) == 1,而numberOfTrailingZeros(n)能快速定位其幂次(如n=32时返回 5,即2⁵) -
快速右移对齐:比如需要把一个数“抹掉”末尾的 0 部分(即除以最大能整除的 2 的幂),可写作
n >> Integer.numberOfTrailingZeros(n)(注意 n ≠ 0) - 哈希表/位图索引优化:在自定义散列结构中,用尾随零数作桶索引可提升 cache 局部性
注意事项与边界情况
使用时需留意以下几点:
- 参数为
int,自动装箱的Integer会拆箱,但传null会抛NullPointerException - 结果范围是 0 到 32(含),不会越界
- 该方法通常被 JVM 内联并映射为 CPU 的
tzcnt或bsf指令(x86),性能极高,远优于手动循环 - 不适用于 long 类型——要用
Long.numberOfTrailingZeros()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











