2012-10-26 21 views
10

में इंटीजर क्लास के टूस्ट्रिंग विधि में मॉड ऑपरेशन के लिए नकारात्मक int का उपयोग क्यों करते हैं जब मैंने जावा संस्करण 1.7.0_09 के स्रोत कोड को पढ़ा, तो मैंने पाया कि इंटीजर क्लास की टूस्ट्रिंग विधि का अहसास मोड की गणना करने के लिए नकारात्मक 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) गैर नकारात्मक integers कि दाईं से बाईं ओर अंकों के साथ चरित्र बफर भर जाएगा की एक धारा की जरूरत है: कोड इस प्रकार है। इस काम को करने के लिए मानक, प्राथमिक-विद्यालय तरीका संख्या की शुरुआत में एक संकेत देना है, और फिर संख्या के पूर्ण मूल्य को मुद्रित करना है।

लेकिन कल्पना करता है, तो नियम थे कि i हमेशा कि पाश में सकारात्मक है: iInteger.MIN_VALUE हो सकता है, तो -i भी Integer.MIN_VALUE होने वाला होता है

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

हैं। Two's complement पूर्णांक चर exactly one more negative integer than they can store positive integers स्टोर कर सकते हैं। हालांकि, यदि invariant है तो i हमेशा नकारात्मक पूर्ण मान है, यह हमेशा int में फिट होगा।

क्यों न केवल Math.abs() या if ब्लॉक का उपयोग क्यों करें? स्वाभाविक रूप से, कई कंप्यूटर प्रोग्रामों में पूर्णांक स्ट्रिंग में अक्सर परिवर्तित होते हैं, इसलिए जितनी जल्दी हो सके toString रखना उपयोगी होता है। समस्या यह है कि Math.abs() और if दोनों कथनों को मशीन कोड में संकलित करते समय शाखा निर्देशों का उपयोग करने के लिए संकलित किया जाएगा। Branchesinstruction pipelining में हस्तक्षेप करते हैं; इसलिए, प्रदर्शन पर ध्यान देने पर आप संभव होने पर if ब्योरे से बयान हटाने का विकल्प चुन सकते हैं।

नोट: इस प्रकार का अनुकूलन शायद ही कभी एक अच्छा विचार है! प्रदर्शन लाभ छोटा होता है जब तक कि आपका कोड बहुत बार (इस कोड की तरह) नहीं कहा जाता है या आप बहुत से उपयोगकर्ताओं और कुछ पाठकों/संशोधक (इस कोड की तरह) के साथ एक लाइब्रेरी बना रहे हैं, और यह कोड को पढ़ने, समझने और पढ़ने के लिए कठिन बनाता है, परिवर्तन। इस अनुकूलन को बनाकर, जावा इंजीनियर आपके कोड को बहुत तेज़ी से बढ़ा सकते हैं - लेकिन यदि आप इस तरह की तकनीकों को आपके द्वारा लिखे गए कोड में डालते हैं, तो आपके सहकर्मी/ग्रेडर स्टैक ओवरफ़्लो से पूछने के इच्छुक नहीं हो सकते हैं कि आपका कोड समझने में इतना मुश्किल क्यों है। :)

टीएल; डीआर: बस एक शिक्षित अनुमान है, लेकिन यह दो के पूरक गणित और कोड अनुकूलन का संयोजन है।

+0

Thx बहुत कुछ! मुझे लगता है कि मैं यही चाहता हूँ! – Judking