Integer.lowestOneBit(n) 返回n二进制中最右边1所代表的2的幂(如12→4),0时返回0;等价于n & -n,常用于判断2的幂、Fenwick树lowbit等。

Integer.lowestOneBit 用于返回一个整数中**最低位的 1 所在位置对应的值**(即只保留最右边那个 1,其余位全为 0)。它不返回位置索引(比如第 0 位、第 3 位),而是返回该位的**实际数值**(2 的幂)。
理解 lowestOneBit 的行为
对任意非零 int 值 n,Integer.lowestOneBit(n) 返回的是 n 的二进制表示中**最右边的 1 所代表的 2 的幂**。例如:
-
lowestOneBit(12)→ 12 的二进制是1100,最右的 1 在第 2 位(从 0 开始计),对应值是4(即 2²) -
lowestOneBit(7)→111→ 最右的 1 在第 0 位 → 返回1 -
lowestOneBit(-1)→ -1 的补码全是 1(32 个 1),最右的 1 还在第 0 位 → 返回1 -
lowestOneBit(0)→ 返回0(特殊约定,因为 0 没有 1 位)
底层原理:利用位运算技巧
这个方法等价于:n & (-n)(对非零 n 成立)。因为负数在 Java 中用补码表示,-n 等于 ~n + 1,而 n & (~n + 1) 恰好提取出最右的 1 及其右侧所有 0 —— 结果就是最低有效 1 对应的权值。
- 例如 n = 12(
0...01100),-n 是1...10100,按位与得0...00100= 4 - 这个技巧高效且无需循环或查表
常见用途
这个方法常用于位操作场景:
立即学习“Java免费学习笔记(深入)”;
- 快速判断一个数是否为 2 的幂:
n != 0 && n == Integer.lowestOneBit(n) - 提取某个掩码中的最低设置位,配合
n &= n - 1实现遍历所有置位 - 在树状数组(Fenwick Tree)中计算 lowbit,用于索引跳转
- 配合位图做状态枚举时,逐个取出独立标志位
注意事项
使用时需注意几点:
- 输入为 0 时返回 0,不是 1 或异常,调用方要主动处理
- 对负数也有效,但意义仍基于补码形式的二进制(通常用于位运算逻辑,而非数学含义)
- 若需要的是**位索引**(比如“最低 1 在第几位”),可用
Integer.numberOfTrailingZeros(n)替代


















