2013-01-22 16 views
12

मैं SNMPBEECodec जो इस location
विशेष रूप से देखा जा सकता है पर देख रहा हूँ मैं समारोह encodeLength()
एक टुकड़ा मैं में दिलचस्पी से देख रहा हूँ संख्या में पूर्णांक विभाजन के स्थान पर प्रयोग क्यों हैMath.floor() कोडेक

 int numBytes = 0; 
     int temp = length; 
     while (temp > 0) 
     { 
      ++numBytes; 
      temp = (int)Math.floor(temp/256); 
     } 

(Drexel SNMP library से)।

मैं जानना चाहता हूं कि Math.floor() का उपयोग temp/256 जैसे साधारण इंटीजर डिवीजन के बजाय क्यों किया जाता है। ऐसा लगता है कि सरल पूर्णांक विभाजन एक ही परिणाम देगा। या क्या कोई तकनीकी अंतर है?

+4

@EJP: नहीं, सामान्य रूप से ऐसे कोड के लिए एक अच्छा तकनीकी कारण हो सकता है। इस कारण को समझना बहुत दिलचस्प हो सकता है। हालांकि, ऐसा कोई मामला नहीं है। हालांकि, आप केवल यह पूछकर पता लगाते हैं कि आप खुद को नहीं जानते हैं। – sleske

+3

वे कड़ाई से समकक्ष नहीं हैं: http://stackoverflow.com/questions/10457208/java-how-do-i-perform-integer-division-that-rounds-towards-infinity-rather-tha हालांकि temp है> 0 आपके उदाहरण में यह बराबर है। – assylias

+0

कारण मैंने यह पूछा क्योंकि ड्रेक्सेल लाइब्रेरी एसएनएमपी के लिए एक बहुत लोकप्रिय है। मैं जानना चाहता था कि क्या कुछ स्पष्ट था कि मैं गायब था। ऐसा लगता है कि – jogabonito

उत्तर

17

आपके प्रश्न के तकनीकी हिस्सा उत्तर देने के लिए:

math.floor() का उपयोग करना ज़रूरत से ज़्यादा है: (पूर्णांक गणित के लिए जावा के नियमों के अनुसार) temp/256 एक पूर्णांक है, और एक पूर्णांक पर Math.floor() का उपयोग कर व्यर्थ है। आप बस temp/256 का उपयोग कर सकते हैं।

लेखक ने अपने दिमाग को पढ़ने के बिना जवाब देना असंभव क्यों किया। लेखक जावा में विभाजन के व्यवहार के बारे में उलझन में हो सकता है, और "इसे सुरक्षित खेलना" का फैसला किया - लेकिन यह सिर्फ अटकलें है।

17

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

तो दुर्भाग्य से वास्तविक कारण समय की गलतियों में खो गया है ... लेकिन मैं सहमत हूं, मंजिल() अनिवार्य है। मुझे वास्तव में गीथूब पर कोड पोस्ट करना चाहिए या ऐसे लोगों को इसे बेहतर और विकसित कर सकते हैं। \ जॉन

संबंधित मुद्दे