Integer.highestOneBit(int i) 返回整数i二进制中最高位1所代表的2的幂值(权重值),而非位置索引;如highestOneBit(6)返回4(因6=110₂,最高位权重为2²=4)。

Integer.highestOneBit(int i) 是 Java 中一个非常实用的位运算工具方法,它返回一个 只保留整数 i 二进制表示中最高位的 1、其余位全为 0 的 int 值。这个返回值本质上就是“最高位 1 所在位置对应的权重值”(即 2 的幂)。
它到底返回什么?
例如:
-
Integer.highestOneBit(0)→0(无 1,返回 0) -
Integer.highestOneBit(1)→1(二进制1,最高位 1 权重是 2⁰ = 1) -
Integer.highestOneBit(6)→4(6 = 110₂,最高位在第 3 位(从右往左,0 起始),对应 2² = 4) -
Integer.highestOneBit(17)→16(17 = 10001₂,最高位是 2⁴ = 16)
为什么说它是“权重值”而不是“位置索引”?
注意区分两个概念:
-
位置索引:如
6 = 110₂,最高位 1 在索引 2(从 0 开始计数); -
权重值:该位置代表的数值大小,即
2^索引 = 2² = 4。
highestOneBit 返回的是后者——实际的 2 的幂值,不是下标。若需索引,可用 31 - Integer.numberOfLeadingZeros(i)(对正数)或 Integer.bitLength(i) - 1。
典型使用场景
这个方法常用于需要快速定位数量级或构造掩码的场合:
- 求小于等于 n 的最大 2 的幂:
Integer.highestOneBit(n)(对 n > 0) - 哈希表扩容时找合适桶大小(如
tableSizeFor内部逻辑) - 位图操作中快速定位有效范围边界
- 配合
lowestOneBit实现位区间提取
底层怎么实现的?(简要)
OpenJDK 中该方法通过一系列无符号右移和按位或运算,将最高位 1 “扩散”到低位,最后减一再异或,得到仅含最高位的结果。整个过程是纯位运算,无分支、高效常数时间 O(1)。
不复杂但容易忽略细节。

















