2012-10-26 13 views
10

'daki Integer sınıfında toString yönteminde mod için negatif int'yi 1.7.0_09 java sürümünün kaynak kodunu okuduğumda neden Integer sınıfının toString yönteminin gerçekleştirildiğini mod hesaplamak için negatif int kullandığını buldum operasyon, bunun bir anlamı var mı? algoritmasına görejava src

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

cevap

10

, sen sağdan sola hanesiyle karakter tampon dolduracaktır küçük (< radix) negatif olmayan tamsayılar bir akım gerekir: şöyle kodudur. Bu işi yapmanın standart, ilkokul yolu sayının başına bir işaret koymak ve ardından sayının mutlak değerini yazdırmaktır.

Ama

kural i hep döngü içinde olumlu olduğunu olsaydı düşünün: i ardından -i da Integer.MIN_VALUE olur Integer.MIN_VALUE olur

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

edin. Two's complement tam sayı değişkenleri exactly one more negative integer than they can store positive integers depolayabilir. Ancak, bu değişkenin yerine,her zaman negatif mutlak değer ise, her zaman int'a sığacaktır.

Neden Math.abs() veya if bloğunu kullanamazsınız? Doğal olarak, tamsayılar birçok bilgisayar programında çok sık dizelere dönüştürülür, bu nedenle toString'u olabildiğince hızlı tutmak yararlı olur. Sorun, hem Math.abs() hem de if ifadelerinin büyük olasılıkla makine koduna derlendiğinde şube yönergelerini kullanacak şekilde derlenmesidir. Branches, instruction pipelining ile etkileşime girme eğilimindedir; Bu nedenle, performansa dikkat ederken, mümkün olduğunda döngülerden if ifadelerini kaldırmayı seçebilirsiniz.

NOT: Bu tür bir optimizasyon nadiren iyi bir fikirdir! Kodunuz çok sık olarak adlandırılmadıkça (bu kod gibi) veya çok sayıda kullanıcı ve az sayıda okuyucular/değiştiriciler (bu kod gibi) içeren bir kütüphane oluşturmuyorsanız, performans kazancı miniscedir ve kodun okunmasını, anlaşılmasını ve okunmasını zorlaştırır. değişiklik. Bu optimizasyonu yaparak, Java mühendisleri kodunuzu çok hızlı bir şekilde hızlandırabilirler - ancak yazdığınız kodda bu gibi teknikler koyarsanız, iş arkadaşınız/sınıf öğrenciniz, kodunuzun neden anlaşılması zor olduğu konusunda Yığın Taşımı sorma eğiliminde olmayabilir.

TL; DR: Sadece eğitimli bir tahmin, ancak bu iki tamamlayıcı matematik ve kod optimizasyonunun birleşimidir.

+0

Çok fazla! Bence istediğim bu! – Judking

İlgili konular