Long.lowestOneBit 返回 long 值最低位 1 对应的 2 的幂,如 12(1100)→4;等价于 x & (-x);用于树状数组、判断 2 的幂等;输入 0 时返回 0。

Long.lowestOneBit 是 Java 中 Long 类提供的一个静态方法,用于**获取 long 类型数值中最低位(即最右边)的 1 所代表的权重值(即对应的 2 的幂)**。
它返回的是“最低位 1 对应的 2 的幂”,不是位置索引
例如:
-
Long.lowestOneBit(12)→12的二进制是1100,最右边的 1 在第 2 位(从右往左,最低位为第 0 位),对应权重是2² = 4,所以返回4; -
Long.lowestOneBit(7)→111,最右边的 1 在第 0 位,权重是2⁰ = 1,返回1; -
Long.lowestOneBit(0)→ 没有 1,返回0(这是唯一返回 0 的情况)。
底层原理:x & (-x)
该方法等价于表达式 x & (-x)(对非零 x)。因为:
- 负数在计算机中用补码表示,
-x = ~x + 1; - 当对一个正整数 x 取负后,其补码会将最低位 1 及其右边所有位翻转,再加 1,结果使得
x & (-x)恰好保留最低位的 1,其余全为 0。
典型用途
这个方法常用于:
- 快速提取整数的最低有效位(LSB),比如在树状数组(Fenwick Tree)中计算父节点或下一节点;
- 判断一个数是否为 2 的幂:若
x > 0且Long.lowestOneBit(x) == x,则 x 是 2 的幂; - 位操作优化:如清零最低位 1(
x & (x - 1))与提取最低位 1(x & (-x))配合使用。
注意点
该方法只对 long 类型有效;若需处理 int,可用 Integer.lowestOneBit,逻辑一致。输入为 0 时返回 0,需单独判断避免误用。

















