先把源代码贴出来:
static void getChars(int i, int index, char[] buf) {
int q, r;
int charPos = index;
char sign = 0;
if (i < 0) {
sign = '-';
i = -i;
}
// Generate two digits per iteration
while (i >= 65536) {
q = i / 100;
// really: r = i - (q * 100);
r = i - ((q << 6) + (q << 5) + (q << 2));
i = q;
buf [--charPos] = DigitOnes[r];
buf [--charPos] = DigitTens[r];
}
// [color=red]Fall thru to fast mode for smaller numbers[/color]
// assert(i <= 65536, i);
for (;;) {
q = (i * 52429) >>> (16+3);
r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
buf [--charPos] = sign;
}
}
为什么当i >= 65536时,每次取两位,而当i < 65536就每次取一位,说能增加运算速度(见红色字),没看明白? 忘高手分析!
能增加运算速度,主要是因为 乘法运算要比除法运算快
而为什么是当i q = (i * 52429) >>> (16+3);
相乘时不会溢出吧 2^16 = 65535 而整数最大值是2^32
这里主要是避免使用除法
看向右移16+3=19位 即2^19次方 524288
i*52429/524288≈i/10
它其实就是想做 i/10这个操作