Integer.lowestOneBit 返回整数二进制表示中最低位为1所对应的值(如12→4),本质是n & (-n),适用于算法优化、树状数组等场景,返回值非位置索引,0输入返回0。

Integer.lowestOneBit 是 Java 中一个非常实用的位运算工具方法,它能快速提取整数二进制表示中**最低位为 1 的那一位所代表的值**(即最右边的 1 及其后面的 0 组成的数),而不是返回位置索引。这个操作在算法优化、位图处理、哈希表扩容、树状数组(Fenwick Tree)等场景中特别高效。
理解 lowestOneBit 的行为
该方法接收一个 int 值,返回一个 int:如果输入为 0,返回 0;否则返回仅保留输入二进制中**最右侧那个 1**、其余位全为 0 的数值。
例如:
- Integer.lowestOneBit(12) → 12 的二进制是 1100,最右的 1 在第 2 位(从 0 开始计),对应值是 4(即 100)
- Integer.lowestOneBit(7) → 7 是 111,最右的 1 是第 0 位 → 返回 1
- Integer.lowestOneBit(-4) → 负数按补码处理,-4 的 32 位补码以 1 开头,但 lowestOneBit 对负数仍有效:它等价于 n & (-n),所以 -4 → 返回 4
底层原理:n & (-n)
Integer.lowestOneBit(n) 的实现本质就是 n & (-n)。这是经典的位运算技巧:
立即学习“Java免费学习笔记(深入)”;
- 对正数 n,-n 是其补码(取反 + 1),n 和 -n 的二进制在最右的 1 及更低位上恰好只有该位同为 1,其余位都不同 → 与运算后只剩这一位
- 例如 n = 12(1100),-n = -12(补码为 ...11110100),1100 & 10100 = 100(即 4)
- 这个公式也适用于 0 和负数,语义一致且无分支判断,CPU 执行极快
典型高效用法
不用手写循环或查表,直接调用即可获得关键位信息:
- 判断是否为 2 的幂次:n > 0 && n == Integer.lowestOneBit(n)
- 清零最低位的 1:n & (n - 1),但若需提取该位再操作,lowestOneBit 更直观 —— 比如 n -= Integer.lowestOneBit(n)
- 获取下标对应的树状数组父节点偏移:lowbit = Integer.lowestOneBit(i); parent = i + lowbit(升序)或 i - lowbit(降序)
- 快速定位稀疏位集合中的第一个活跃位:配合 Long.bitCount 或 Integer.bitCount 判断是否只有一个 1,再用 lowestOneBit 提取其值
注意事项
注意几个易错点:
- 返回的是“值”,不是“位置”。要获取位置(即 2 的几次方),可用 Integer.numberOfTrailingZeros(n)
- 对 0 输入返回 0,使用前建议判空或确保非零
- long 类型请用 Long.lowestOneBit,不要强转 int,避免高位截断
- 该方法是 static 且无副作用,线程安全,可放心在高并发逻辑中使用


















