Integer.lowestOneBit()返回整数二进制中最低位1对应的值(如12→4),对0返回0,等价于n & (-n),适用于判断2的幂、树状数组等场景。

Integer.lowestOneBit() 是 Java 中一个高效提取整数二进制表示中**最低位的 1(即最右边的 1)所对应的值**的方法。它不返回位置索引,而是返回一个只保留该位为 1、其余位全为 0 的整数。
理解 lowestOneBit() 的行为
该方法对输入整数 n 执行如下逻辑:
- 若
n == 0,直接返回 0(因为没有 1 可提取); - 否则,找到二进制中最右边的 1,并构造一个仅该位为 1 的数(即
2^k,其中k是该位的索引,从 0 开始计数)。
例如:
-
Integer.lowestOneBit(12)→12的二进制是1100,最右的 1 在第 2 位(从 0 起),对应值为4(即100); -
Integer.lowestOneBit(7)→111→ 最右 1 在第 0 位 → 返回1; -
Integer.lowestOneBit(-8)→ 负数按补码处理:-8的 32 位补码为...11111000,最右的 1 仍在第 3 位 → 返回8。
底层原理:利用位运算技巧
该方法等价于表达式:n & (-n)(对非零整数成立)。这是因为:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 负数在 Java 中用补码表示:-n = ~n + 1;
- ~n 将 n 的所有位取反,+1 后,最右连续的 0 全变 1,直到第一个 1 变 0;
- n 和 -n 的按位与,恰好只保留原数最右的 1,其余位均为 0。
所以你也可以手动写成:int lowest = (n == 0) ? 0 : n & (-n);
典型使用场景
这个操作常用于位图处理、权限掩码、树状数组(Fenwick Tree)、快速判断是否为 2 的幂等场景:
-
判断是否为 2 的幂:若
n > 0且Integer.lowestOneBit(n) == n,说明 n 恰好只有一个 1 → 是 2 的幂; -
清零最低位的 1:配合
n & (n - 1)使用,可逐个移除最低位的 1(如统计 1 的个数); - 提取权值或分组标识:比如在哈希表扩容或分段锁中,用最低有效位区分桶归属。
注意事项
注意几个边界和细节:
- 参数为 0 时返回 0,不是 1 或异常;
- 对负数也有效,但结果恒为正数(因为只保留一个 1,符号位不会被选中);
- 返回的是“值”,不是“位置”——如需索引(即第几位),可用
Integer.numberOfTrailingZeros(n); - 该方法是 JDK 1.5 引入的静态工具方法,无需实例化,直接调用即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










