
本文介绍使用 Long.numberOfTrailingZeros() 高效、准确获取 long 值最低有效置位(最右侧 1)的 1-based 位索引,完美支持 64 位全范围(包括第 64 位),避免浮点运算误差与边界失效问题。
本文介绍使用 long.numberoftrailingzeros() 高效、准确获取 long 值最低有效置位(最右侧 1)的 1-based 位索引,完美支持 64 位全范围(包括第 64 位),避免浮点运算误差与边界失效问题。
在 Java 中,定位一个整数中最低有效置位(Least Significant Bit, LSB) 的位置——即最右侧值为 1 的比特位的索引(按 1-based 计数,即最低位为第 1 位,最高位为第 64 位)——是位操作中的常见需求。原始实现依赖 Math.log10(n & -n) / Math.log10(2) 存在明显缺陷:浮点对数运算易受精度损失影响,尤其当 n 是 2^63(即第 64 位为 1)时,n & -n 结果为 2^63,但 Math.log10(2^63)/Math.log10(2) 在双精度下可能向下取整为 63.0,强制转为 int 后得 63,而非正确的 64;更严重的是,该方法对 long 超出 double 精确整数表示范围(2⁵³)的部分完全不可靠。
Java 标准库提供了专为此类场景优化的原生方法:Long.numberOfTrailingZeros(long i)。它直接利用 CPU 指令(如 x86 的 TZCNT 或 BSF)高效计算二进制表示中末尾连续 0 的个数,时间复杂度 O(1),无精度损失,且完全支持 64 位 long 全域。
因此,正确、简洁、高性能的实现如下:
public static int getLSBIndx(long n) {
return n == 0 ? -1 : Long.numberOfTrailingZeros(n) + 1;
}✅ 原理说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
n & -n得到仅保留 LSB 的掩码(例如0b10100→0b100),但无需显式计算; -
Long.numberOfTrailingZeros(n)直接返回 LSB 左侧(低位侧)的 0 的个数; - 加 1 即得 1-based 位索引(如
0b1→ 0 trailing zeros → 索引 1;0b10000000...0(第 64 位)→ 63 trailing zeros → 索引 64)。
⚠️ 注意事项:
- 输入为
0时无置位,应明确返回约定值(如-1),不可忽略; - 此方法天然支持所有合法
long值(-2^63到2^63-1),对负数也正确(因numberOfTrailingZeros基于补码二进制表示,而n & -n在补码下仍能提取 LSB); - 避免使用
Integer.numberOfTrailingZeros((int)n)强转,会导致高位信息丢失(如0x100000000L转int后为 0)。
综上,Long.numberOfTrailingZeros(n) + 1 是获取 long 类型 LSB 1-based 索引的标准、可靠、高效解法,应作为首选方案替代任何基于浮点对数或手动位移的实现。

















