在Hadoop的类org.apache.hadoop.io.WritableComparator中有如下一段代码,完成将Integer值序列化后对应的字节码数组重新反序列化为Integer的功能。
初读这一段代码我怎么也没有想明白,其中究竟是如何实现的了。
为了搞清楚其中的究竟,我写了如下一个测试类,试图理解其中的原理,谁知到越搞觉得越是不明白了,甚至我都怀疑起来我原来理解的&操作和<< 、>>等操作是否正确了。
上述程序输出为:
Binary 5:11111111111111111111111111111011
Binary -5:101
byte -5:-5
-5 & 0xff:251
Binary -1:11111111111111111111111111111111
Binary 251:11111011
Binary 256:100000000
Hex 256:100
Binary Integer.MAX_VALUE:1111111111111111111111111111111
Hex Integer.MAX_VALUE:7fffffff
我一直在琢磨,正数和0xff取与也就巴了,但是负数怎么办呢?
后来我决定先看看我头脑中理解的<<操作是左移位,>>是右移位,0xff表示0111 1111是否正确,在网上找了一下,确实没有错啊,就是我理解的那样啊,这样看来就是我们那个正数与负数的字节码表示的玄机在中间起到作用了。
结果在网上一搜索,找到如下一篇文章,算是彻底的让我明白了为什么啦。
汗颜不已,基础知识。
参考: