JDK源代码中的Integer的getChars方法的疑问

先把源代码贴出来:
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这个操作