1. 源码
public static int numberOfLeadingZeros(int i) {
if (i == 0)
return 32;
int n = 1;
if (i >>> 16 == 0) { n += 16; i <<= 16; }
if (i >>> 24 == 0) { n += 8; i <<= 8; }
if (i >>> 28 == 0) { n += 4; i <<= 4; }
if (i >>> 30 == 0) { n += 2; i <<= 2; }
n -= i >>> 31;
return n;
}
2. 方法功能
Returns the number of zero bits preceding the highest-order
("leftmost") one-bit in the two's complement binary representation
of the specified {@code int} value. Returns 32 if the
specified value has no one-bits in its two's complement representation,
in other words if it is equal to zero.
翻译: 返回 int 类型 32 位补码值最左边出现的 1 之前的 0 的个数,如果是 0 因为没有 1,就返回 32
举个栗子: 10 的补码为 0000 0000 0000 0000 0000 0000 0000 1010,则最左边 1 之前有 28 个 0,所以此方法返回 28.
3. 源码分析
- 0 的情况返回 32
- 中间部分实际上是二分法的应用,比如第一个判断如果成立,表示第一个非零值位于低 16 位,然后再将 i 值左移 16 位使得第一个非零值到达高 16 位进入第二个判断。依次律推进行二分。
- 还有一个巧妙的地方就是 n 初始化值为 1,因此到了最后一步 i>>>>31 如果是 1,那么 n 就减 1,如果为 0 就不变。
作者 @ 没有故事的老大爷
别想太多,想不过来
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于