2012-10-26 2 views
10

javaバージョン1.7.0_09のソースコードを読むと、IntegerクラスのtoStringメソッドの実装で負のintを使用してmodを計算することがわかりました操作、それには何か意味がありますか?次のようにコードは次のとおりです。java srcのIntegerクラスのtoStringメソッドで負のintを使用する理由

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)); 
} 

答えて

10

アルゴリズムによると、あなたは右から左に数字で文字バッファを埋めるだろう小さな(< radix)非負整数の流れを必要としています。この作業を行うための標準的な、小学校の方法は、数字の先頭に記号を付け、数字の絶対値を印刷することです。

しかし、ルールはiは、そのループで常にポジティブであるとした場合を想像:

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

iInteger.MIN_VALUEであることを起こる場合は、-iInteger.MIN_VALUEであることを起こります。 Two's complement整数変数にはexactly one more negative integer than they can store positive integersを格納できます。ただし、不変量がiの場合は常に負の値の絶対値であるため、常にintに収まります。

Math.abs()またはifブロックを使用するだけではどうですか?もちろん、整数は多くのコンピュータプログラムで文字列に変換されるため、できるだけ早くtoStringを使用すると便利です。問題は、Math.abs()ifの両方のステートメントが、マシンコードにコンパイルされたときに分岐命令を使用するようにコンパイルされる可能性があることです。 Branchesinstruction pipeliningと干渉する傾向があります。したがって、パフォーマンスに注意を払うときは、可能であればループからifステートメントを削除することを選択することがあります。

注:この種の最適化は、めったに良い考えではありません。コードが非常に頻繁に(このコードのように)呼び出されたり、多数のユーザーと(このコードのような)読者/修飾子がほとんどないライブラリを構築している場合を除き、パフォーマンスの向上はわずかです。変化する。この最適化を行うことで、Javaのエンジニアはあなたのコードを非常にわずかに加速させるかもしれませんが、あなたが書くコードにこのようなテクニックを置くと、あなたの同僚/グレーダーはあなたのコードを理解しにくい理由をStack Overflowに尋ねる傾向にはなりません。 :)

TL; DR:教育的な推測ですが、これは2の補数演算とコード最適化の組み合わせです。

+0

Thxたくさん!私はこれが私が望むものだと思う! – Judking

関連する問題