java位运算和字节编码(二)

java 4 2016-02-29 13:03
女装

上一篇文章我们讨论到byte强制转换成int。然后抛出了一个问题,就是byte直接强制转换成int一定会没问题吗?还是因为上面我们推导的那个例子只是个特例。好吧,正式回答下,一定是没有问题的。虽然发生了符号位扩展,但是没有任何问题。这就是计算机中原码和补码的奥秘之处。

我们来看下JDK中Integer类中的静态方法numberOfLeadingZeros

   public static int numberOfLeadingZeros(int i) {
        // HD, Figure 5-6
        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;
    }

乍一看,啥跟啥。完全看不懂。不过等你看懂了就会发现位运算的巧妙之处。这个函数的作用呢其实就是计算整形变量i高位连续为零的个数。比如 i = 1 时 二进制补码就是原码也就是 00000000 00000000 00000000 00000001,那么得到的结果应该是31。这个函数本身有什么用呢,自己去猜吧。好吧,不卖光子了,比如你想知道一个int整形的比1021这个整数更大而且属于2的次方幂。
1 << (32 - (Integer.numberOfLeadingZeros(i - 1))),得到的结果应该是1024。

未完待续 ...
原文链接:http://segmentfault.com/a/1190000003826303

女装
文章评论