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

 

我记得以前看JVM的书籍时,好像int是JVM里面的基本单元,一个long其实是用两个int进行操作的,boolean、byte、short其实都是用int的。再加上网上一哥们的实际测试(http://jiahua8859-163-com.iteye.com/blog/573535)发现下面的规律: 

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范围内溢出; 

 

综上,这个方法是进行了最大优化了

猜你喜欢

转载自churchchen86.iteye.com/blog/2279132