JDK:整数。获取字符(int, int指数,char[]缓冲区

  

在整数类的源码中,toString方法中调用获取字符方法,获取字符方法是获取数值对应的字符串,其中有两个地方使用了非常巧妙的方式来进行除法运算和取余运算。在计算机中,a/b和a % b相比较位运算,都是比较费时的计算的。下面来看看jdk中是如何优化计算的

  
 <代码>//每迭代生成两个数字
  虽然(我在=65536){
  q=i/100;//真的:r=i - (q * 100);
  我(r=(q & lt; & lt;6)+ (q & lt; & lt;5)+ (q & lt; & lt;2));
  我=问;
  但[——charPos]=DigitOnes [r];
  但[——charPos]=DigitTens [r];
  }//秋天通过快速模式更小的数字//维护(我& lt;=65536,我);
  (,) {
  q=(我* 52429)在祝辞祝辞(16 + 3);
  我(r=(q & lt; & lt;3)+ (q & lt; & lt;1));//r=i - q * 10)……
  但[——charPos]=数字[r];
  我=问;
  如果(i==0)休息;
  }
  如果(标志!=0){
  但[——charPos]=符号;
  } 
  

思路是这样:
当我在=65536时,是每两位取出数字,i/=100,例如i=567235474,
(1)先取最后两位7和4放入缓冲区数组中,i=5672354, buf={,,,,,,, ' 7 ', ' 4 '};
(2)再取最后两位5和4放入缓冲区数组中,我=56723,buf={,,,,, ' 5 ', ' 4 ', ' 7 ', ' 4 '};
当我& lt;65536时,跳出循环,采用每一次取出一位数字,也就是我/=10
(3)取最后一位3放入缓冲区数组中,我=5672,buf={,,, ' 3 ', ' 5 ', ' 4 ', ' 7 ', ' 4 '};
(4)取最后一位2放入缓冲区数组中,我=567,buf={,,, ' 2 ', ' 3 ', ' 5 ', ' 4 ', ' 7 ', ' 4 '};
(5)取最后一位7放入缓冲区数组中,i=56岁buf={, ' 7 ', ' 2 ', ' 3 ', ' 5 ', ' 4 ', ' 7 ', ' 4 '};
(6)取最后一位6放入缓冲区数组中,我=5,buf={' 6 ', ' 7 ', ' 2 ', ' 3 ', ' 5 ', ' 4 ', ' 7 ', ' 4 '};
(7)取最后一位5放入缓冲区数组中,我=0,buf={' 5 ', ' 6 ', ' 7 ', ' 2 ', ' 3 ', ' 5 ', ' 4 ', ' 7 ', ' 4 '},结束。
但在jdk中,并不都是直接用a/b除法和% c取余来获取商和余数的

  

1,对100除法:q=i/100,直接除法

  100年

2,对取余:r=i - ((q & lt; & lt;6)+ (q & lt; & lt;5)+ (q & lt; & lt;2));
推导如下:
r=i - q x 100)
r=i - q (q x 64 + 32 + q x 4)
r=i - ((q & lt; & lt;6)+ (q & lt; & lt;5)+ (q & lt; & lt;2)

  

3,对10除法:q=(我x 52429)在祝辞祝辞(16 + 3),
推导如下:
2祝辞祝辞祝辞19为524288,
q=(52429 x i)/524288=(52428.8 x + 0.2 x)在祝辞祝辞(16 + 3),
我拆分为两部分,我=x 10 + b(保证a, b均为正数,且0 & lt;=b & lt;=9,
q=((10 a + b) x 52428.8 + 0.2 b)在祝辞祝辞19日
q=(524288 + 52428.8 + 0.2我)在祝辞祝辞19日
其中,
52428.8 b最大值为52428.8 x 9, 0.2我最大值为13107.2
所以,
52428.8 b + 0.2我最大值为484966.4,小于524288年(1祝辞祝辞祝辞19),对应二进制会被右移掉
所以,
q=(x 524288)在祝辞祝辞19 + (52428.8 x b + * 0.2)在祝辞祝辞19=(x 524288)在祝辞祝辞524288=

  

4,对10取余:r=i - ((q & lt; & lt;3)+ (q & lt; & lt;1));
推导如下:
r=i - q x 10)
r=i - (q x 8 + q * 2)
r=i - ((q & lt; & lt;3 + q & lt; & lt;1)

  

从这个方法我们学到的

  

1,乘法比除法高效:q=(我 52429)在祝辞祝辞(16 + 3);=比;约等于q0.1,但i52429是整数乘法器,结合位移避免除法
2,充分利用计算结果:在获取r(我100)时,充分利用了除法的结果,结合位移避免重复计算
3位移比乘法高效:r=i - ((q & lt; & lt;6)+ (q & lt; & lt;5)+ (q & lt; & lt;2));=在等价于r=i - q
100)
4局部性原理之空间局部性

JDK:整数。获取字符(int, int指数,char[]缓冲区