yscyfy 2013-02-18 20:55
浏览 295
已采纳

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就每次取一位,说能增加运算速度(见红色字),没看明白? 忘高手分析!

  • 写回答

2条回答 默认 最新

  • iteye_7981 2013-02-19 13:55
    关注

    能增加运算速度,主要是因为 乘法运算要比除法运算快

    而为什么是当i q = (i * 52429) >>> (16+3);
    相乘时不会溢出吧 2^16 = 65535 而整数最大值是2^32

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器