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

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java位运算和字节编码(二)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

脚本宝典总结

以上是脚本宝典为你收集整理的java位运算和字节编码(二)全部内容,希望文章能够帮你解决java位运算和字节编码(二)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。