jdk 源码:Integer.numberOfLeadingZeros

本贴最后更新于 2040 天前,其中的信息可能已经事过境迁

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 就不变。

作者 @ 没有故事的老大爷
别想太多,想不过来

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...