2016-10-11 13 views
7

सी ++ आप रेंज की जाँच के लिए एक में दो पूर्णांक तुलना गठबंधन करने के लिए अनुमति देता है, जैसेडबल तुलना चाल जावा में

(unsigned)X < (unsigned)Upper 

जब

0 <= X < Upper 

जावा भाषा नहीं अहस्ताक्षरित प्रकार है जो सच देता है। क्या आप एक ही प्रभाव प्राप्त करने के लिए एक ही प्रभाव प्राप्त करने का एक तरीका देखते हैं, न कि बहुत अधिक ओवरहेड?

अद्यतन:

@Bathsheba द्वारा एक टिप्पणी से, चार प्रकार अहस्ताक्षरित 16 बिट है और के रूप में मेरे पूर्णांकों शॉर्ट्स की रेंज में वास्तव में कर रहे मेरा उद्देश्य के लिए फिट हो जाएगा।

प्रश्न int एस के लिए खुला रहता है।

संभवतः (X | (Upper - 1 - X)) >= 0 की रेखा में कुछ, जो 30 बिट्स की एक श्रृंखला की अनुमति देता है।

+2

मेरे पास मेरे सिर के ऊपर से कोई जवाब नहीं है, लेकिन जिज्ञासा से, क्या यह वास्तव में महत्वपूर्ण है? मुझे यकीन नहीं है कि दो तुलनात्मक आदेशों को निष्पादित करना, जो मूल प्रोसेसर कमांड हैं, किसी भी तरह से कलाकारों की तुलना में अधिक महंगा है और आपके पास सी ++ की तुलना है। मुझे लगता है कि वास्तव में ऐसा फीचर भारी अनुकूलन चाहते हैं और मुझे विश्वास नहीं है कि पहला विकल्प बेहतर है। ऐसा कहा जा रहा है कि ये सिर्फ अटकलें हैं, मैं कोई विशेषज्ञ नहीं हूं। – TheFooBarWay

+0

क्या यह चाल भी बड़े एक्स या बड़े ऊपरी (~ integerMax) के साथ woking है? – olsli

+1

हां यह वास्तव में महत्वपूर्ण है। सशर्त शाखाएं बहुत महंगी हो सकती हैं (जैसे 1 चक्र की बजाय 12 चक्र) क्योंकि वे शाखा की गलतफहमी के मामले में पाइपलाइनिंग तोड़ते हैं। जब यह एक लूप के अंदर किया जाता है जिसे प्रति सेकेंड 70 मिलियन बार निष्पादित करने की आवश्यकता होती है, तो इससे कोई फर्क पड़ता है। वैसे, कास्ट वास्तव में नहीं किया जाता है और शून्य लागत है। (बस एक हस्ताक्षरित तुलना का उपयोग किया जाता है)। –

उत्तर

4

यदि आप जावा में डेटाटाइप चाहते हैं जो किसी असाइन किए गए 32-बिट int को पकड़ने वाले मानों की श्रेणी को पकड़ने में सक्षम है, तो आपको long की आवश्यकता है। आप हस्ताक्षरित int को परिवर्तित करने के लिए 32 एक-बिट्स के साथ बिट-मास्क कर सकते हैं जो निश्चित रूप से निश्चित रूप से सकारात्मक long मान के लिए ऋणात्मक है।

(x & 0xffffffffL) < upper 

//   ^
//    Implicit conversion to long (of both arguments) 
बेशक

64-बिट "और" और 64-बिट तुलना के लिए कुछ अतिरिक्त समय, लेकिन शायद पाइप लाइन ब्रेक से भी कम समय लगेगा।

+0

मैं इस समाधान से सहमत हूं। मैं कुछ आशा रखता हूं कि थोड़ा बेहतर किया जा सकता है क्योंकि सकारात्मक मूल्य वास्तव में 31 बिट्स पर हैं, जबकि ऋणात्मक हैं ... नकारात्मक। –

+0

@YvesDaoust ठीक है हाँ, लेकिन यह एक बिट है सी में आपकी चाल की लागत है। जावा में हमारे पास 31/32-बिट मानों पर हस्ताक्षरित तुलना नहीं है (हालांकि अगर मेरे सुझाव का उपयोग बहुत से लोगों द्वारा किया गया था, तो एक JVM जैसे हॉटस्पॉट आसानी से इसका पता लगा सकता है और 32-बिट हस्ताक्षरित तुलना ऑपरेशन के साथ 64-बिट ऑपरेशंस को प्रतिस्थापित कर सकता है) –

+0

नहीं, कुछ खो गया नहीं है। डेटा पर हस्ताक्षर किए जाने चाहिए, क्योंकि यह वास्तव में नकारात्मक हो जाता है (अन्यथा कोई बिंदु जांच सकारात्मक नहीं होगा)। आप यह भी समझते हैं कि परीक्षण का प्राथमिक उपयोग सरणी अतिप्रवाह का पता लगाने के लिए है। हम हर दिन एक बिलियन तत्वों के सरणी का उपयोग नहीं करते हैं। –

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