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 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题