上一篇文章我们讨论到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