JDK源码分析----Integer
JDK源码分析----Integer
http://blog.csdn.net/chenloveit/article/details/18969459
http://www.tuicool.com/articles/22aQjuu
java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)
http://blog.sina.com.cn/s/blog_99201d890101hd6s.html
移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:
(1)<< : (left-shift), 最低位补0
(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移
(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移
(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。
(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:
http://blog.sina.com.cn/s/blog_439f80c40100n0hc.html
int的运算速度最快,short次之,byte再次之,long再次之。float和double运算速度最慢。
这解释了,一旦把i降到int范围内之后,就用int进行计算,当然,计算方式是一致的;
还有一些规律:加减法、位运算、布尔运算很快、乘法次之、除法更次之;除法比乘法慢好几倍,这也解释了为什么:
q2 = (i2 * 52429) >>> (16+3); 不直接写成 q2/=10;了;
( >>>(16+3)就是除以2^19,即524288,52429/524288=0.1000003814697265625 )
也解释了为什么在i2<65536之后才进行上述的计算,因为i2*52429不会在int范围内溢出;
综上,这个方法是进行了最大优化了