站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题Integer类中toString(int i)方法的(i * 52429)>>>(16+3)的问题

Integer类中toString(int i)方法的(i * 52429)>>>(16+3)的问题

摘要: Integer类中toString(int i)方法的(i * 52429)>>>(16+3)的问题


java.lang.Integer.toString(int i)方法里的q = (i * 52429)>>>(16+3);是就相当于q=i/10,其中i是小于65536的整数。
看了Division by Invariant Integers using Multiplication这片文章(用文章名字就能搜到PDF),看不懂。写这个方法的人就是根据这个文章来写上面的语句的。
不知道有没人会的?52429和19这两个值是怎么算出来的?


顶.


不懂,也没见过,顶先...


楼主什么意思啊,Integer.toString(int i)的源码明明不是这么的嘛
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(0, size, buf);
}
这才是啊


看不太懂,关注ing


哦,是在这个函数的getChars(i, size, buf);就在toString(int i)下面,


太复杂了


因为2<<(16+3)=2<<19=524288,
(i * 52429)>>>(16+3) = i*52429/524288=
52429.0/524288=0.1000003814697......
6位的精度已经足够多了,所以就是i*0.1。


2^19=524288
呵呵


楼上的厉害


性能啊性能……
其实我觉得没有必要这样优化……

飘过


lz是搞研究的吧,顶一下。


哦,原来如此。
那(i * 26215)>>>(16+2)也是除10的意思,只是奇怪他干吗挑52429呢?应该是随便挑的吧。。


2^10=1024, 103/1024=0.1005859375
2^11=2048, 205/2048=0.10009765625
2^12=4096, 410/4096=0.10009765625
2^13=8192, 820/8192=0.10009765625
2^14=16384, 1639/16384=0.10003662109375
2^15=32768, 3277/32768=0.100006103515625
2^16=65536, 6554/65536=0.100006103515625
2^17=131072, 13108/131072=0.100006103515625
2^18=262144, 26215/262144=0.10000228881835938
2^19=524288, 52429/524288=0.10000038146972656

选19是在不超出整形范围内,精度最高的。



↑返回目录
前一篇: 图像合成问题
后一篇: jar双击没有反应?