2012-02-01 11 views
12

क्या कोई विशेष कारण है कि ये गायब हैं?जावा 'बिटसेट' में `shiftLeft` और` shiftRight` फ़ंक्शन क्यों नहीं हैं?

वे BigInteger में मौजूद हैं, लेकिन BigInteger के अपरिवर्तनीय डिज़ाइन पैटर्न के कारण ये आमतौर पर बहुत धीमे होते हैं। BitSet बहुत अच्छा है क्योंकि यह उत्परिवर्तनीय है, लेकिन मुझे shift फ़ंक्शंस (<< और >>>long के लिए वास्तव में याद आती है)। BitSet के लिए, एक इनस्थल स्थानांतरण भी उपयोगी होगा, साथ ही चक्रीय रोटेशन भी होगा।

मैंने Shifting a Java BitSet का जवाब देखा है (स्थानांतरण के लिए get(off, len) का उपयोग करके, हालांकि इसकी प्रतिलिपि की आवश्यकता है)।

मुझे गलत मत समझो। मुझे पता है कि बग की रिपोर्ट कहां करें। मैं बस सोच रहा हूं कि कोई विशेष कारण उन्हें छोड़ने के लिए था, उदा। कुछ डिजाइन पैटर्न या ऐसी अवधारणा। विशेष रूप से वे BigInteger में शामिल हैं।

+0

क्योंकि यह 'सेट' है, न कि 'स्ट्रिंग'। – bmargulies

+1

@bmargulies: ए 'लम्बा' एक स्ट्रिंग नहीं है। फिर भी, इसमें शिफ्ट ऑपरेटर हैं। और वास्तव में एक 'स्ट्रिंग' नहीं है। और 'get (i, j) 'semantics अनिवार्य रूप से' substring' से सहमत हैं, और 'long' के लिए उपलब्ध नहीं हैं ... –

+0

शब्द' सेट 'का अर्थ है' an * unordered * संग्रह '। बिटसेट के पास यह जानने का काम है कि 2 की कौन सी शक्तियां चालू हैं, उन्हें शफल करने की नहीं। – bmargulies

उत्तर

9

संकल्पनात्मक रूप से, BitSet आमतौर पर कई सेटिंग्स को ट्रैक करने के लिए उपयोग किया जाता है, जैसे सेट में प्रत्येक बिट का एक विशिष्ट अर्थ होता है। तो उस संदर्भ में एक शिफ्ट ऑपरेशन थोड़ा समझ में आता है।

आपको BitSet के लिए स्पष्ट रूप से एक और उपयोगी उद्देश्य मिला है, लेकिन यह उस दायरे से बाहर है जिसके लिए BitSet शायद कल्पना की गई थी।

+1

[डॉक्स] से उद्धरण के लिए (http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html): बिटसेट को "बिट्स के वेक्टर" के रूप में कल्पना की गई थी जो आवश्यकतानुसार बढ़ती है । " आपके द्वारा सुझाए गए सामान्य उपयोग से यह बहुत अधिक सामान्य है। अन्य वेक्टर वर्ग (वेक्टर, ऐरेलिस्ट, इत्यादि) में "शिफ्ट" ऑपरेशन नहीं होता है, लेकिन उनके पास "डालने" और "हटाएं" ऑपरेशन होते हैं जो प्रभावी रूप से एक ही काम करते हैं। बिटकसेट के लिए समान कार्यक्षमता होने का अर्थ होगा, लेकिन ऐसा नहीं है। –

+0

(अनियंत्रित) 'सेट' बिंदु अच्छा है, सिवाय इसके कि यह कुछ हद तक उपयोग नहीं किया जाता है। धन्यवाद। –

+0

मैं इस विचार पर सवाल करता हूं कि बिटसेट सेटिंग्स के लिए है। अगर मैं सेटिंग्स कर रहा हूं, तो मैं या तो "वास्तविक प्रोग्रामर" की तरह एक int/long में बिट्स का उपयोग करता हूं :-) 20 साल पहले किया गया था, या, अधिक ठीक से, मैं Enums और EnumSet का उपयोग करूंगा। मैं बिट्ससेट्स को एक स्पैस/कॉम्पैक्ट 'सेट ' के रूप में अधिक उपयोग करता हूं। – user949300

1

मेरा अनुमान है कि यह उनके कुछ कोड तरीके को और अधिक जटिल बना देगा। उदाहरण के लिए, यदि आप "सब कुछ 3 से शिफ्ट छोड़ देते हैं", तो आपके पास एक अतिरिक्त फ़ील्ड हो सकता है, शिफ्ट, जो -3 है (या शायद 3, मुझे केवल सही होने का 50% मौका मिला है :-)। और, get() और set() विधियों के लिए, यदि आप बस शिफ्ट द्वारा बिट इंडेक्स समायोजित करते हैं, तो कोड को काम करना चाहिए। जैसे

public boolean get(int bitIndex) { 
    bitIndex += shift; // new code!!! 
    if (bitIndex < 0) 
     throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex); 

    checkInvariants(); 

    int wordIndex = wordIndex(bitIndex); 
    return (wordIndex < wordsInUse) 
     && ((words[wordIndex] & (1L << bitIndex)) != 0); 
    } 

हालांकि, अन्य कार्यों में से कुछ, intersects की तरह के लिए() और या(), कोड वास्तव में गंदा हो रही शुरू होगा। अभी विधि या() के मूल बहुत ही सरल और तेज है:

// Perform logical OR on words in common 
    for (int i = 0; i < wordsInCommon; i++) 
     words[i] |= set.words[i]; 

    // Copy any remaining words 
    if (wordsInCommon < set.wordsInUse) 
    System.arraycopy(set.words, wordsInCommon, 
        words, wordsInCommon, 
       wordsInUse - wordsInCommon); 

दोनों BitSets था संभव बदलाव इस गन्दा तेजी से मिलेगा। उन्होंने शायद यह पाया कि यदि आप वास्तव में बदलाव करना चाहते हैं, तो आपको प्राप्त करने और प्रतिलिपि का उपयोग करना चाहिए।

एक चीज जो मुझे आश्चर्यचकित करती है - प्राप्त करने में(), वे 1L << bitIndex&31 नहीं करते हैं। स्पष्ट रूप से < < चारों ओर लूप्स, जो अब मुझे अपनी लंबी दूरी की मशीन भाषा याद है, समझ में आता है।

+1

हां, मैंने ऐसा करने पर विचार किया। लेकिन मुझे वास्तव में काम करने के लिए 'या' और' xor' की आवश्यकता थी। जावा में वास्तव में 'बिगइंटर' में 'int []' पर बदलाव करने के लिए कोड होता है, और वे 'लंबे समय तक' के लिए 'बिटसेट' पर बहुत अधिक प्रतिलिपि बना सकते हैं। यह वास्तव में बहुत अलग नहीं है। –

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