【问题标题】:why using negative int for mod operation in toString method of Integer class in java srcjava - 为什么在java src中Integer类的toString方法中使用负int进行mod操作
【发布时间】:2012-10-16 08:23:30
【问题描述】:

看了java 1.7.0_09版本的源码,发现Integer类的toString方法的实现是用负int来计算mod运算的,有什么意义吗?代码如下:

public static String toString(int i, int radix) {

    if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
        radix = 10;

    /* Use the faster version */
    if (radix == 10) {
        return toString(i);
    }

    char buf[] = new char[33];
    boolean negative = (i < 0);
    int charPos = 32;

    if (!negative) {     
        i = -i;                //***** change i to negative
    }

    while (i <= -radix) {
        buf[charPos--] = digits[-(i % radix)];   //***** change back to positive after 
                                                 //***** mod operation
        i = i / radix;
    }
    buf[charPos] = digits[-i];

    if (negative) {
        buf[--charPos] = '-';
    }

    return new String(buf, charPos, (33 - charPos));
}

【问题讨论】:

    标签: java tostring modulo


    【解决方案1】:

    根据算法,您需要一个小的 (&lt; radix) 非负整数流,它将用从右到左的数字填充字符缓冲区。完成这项工作的标准小学方法是在数字的开头放一个符号,然后打印数字的绝对值。

    但想象一下,如果规则是 i 在该循环中始终为正:

    if (negative) {
        i = -i; // change i to positive
    }
    

    如果i 恰好是Integer.MIN_VALUE,那么-i 也恰好是Integer.MIN_VALUETwo's complement整型变量可以存储exactly one more negative integer than they can store positive integers。但是,如果不变量是 i 始终是 绝对值,则它将始终适合 int

    为什么不直接使用Math.abs()if 块?自然,整数在许多计算机程序中非常频繁地转换为字符串,因此尽可能快地保持toString 很有用。问题是,Math.abs()if 语句在编译为机器代码时都可能被编译为使用分支指令。 Branches倾向于干扰instruction pipelining;因此,在关注性能时,您可能会选择尽可能从循环中删除 if 语句。

    注意:这种优化很少是个好主意!除非您的代码被非常频繁地调用(例如此代码),或者您正在构建一个拥有大量用户和很少读者/修改器的库(例如此代码),否则性能提升是微乎其微的,并且它使代码更难阅读、理解和改变。通过进行这种优化,Java 工程师可能会稍微加快您的代码速度——但如果您将这样的技术应用到您编写的代码中,您的同事/评分者可能不会倾向于询问 Stack Overflow 为什么您的代码如此难以理解。 :)

    TL;DR:只是一个有根据的猜测,但这是二进制补码数学和代码优化的组合。

    【讨论】:

    • 非常感谢!我想这就是我想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多