जब से तुम सी के साथ ही सी ++ का उल्लेख है, मैं मान लेंगे कि एक सी ++ - उन्मुख boost::dynamic_bitset
तरह समाधान लागू नहीं हो सकता है, और एक निम्न स्तर के सी कार्यान्वयन के बारे में बात बजाय। ध्यान दें कि अगर boost::dynamic_bitset
आपके लिए कुछ काम करता है, या कोई पूर्व-मौजूदा सी लाइब्रेरी है जो आप पा सकते हैं, तो उनका उपयोग करके स्वयं को रोल करने से बेहतर हो सकता है।
चेतावनी: निम्न में से कोई भी कोड परीक्षण या संकलित नहीं किया गया है, लेकिन यह आपको आवश्यकतानुसार बहुत करीब होना चाहिए।
शुरू करने के लिए, मान लें कि आप एक निश्चित bitset आकार एन फिर निम्न कार्य की तरह कुछ है:
typedef uint32_t word_t;
enum { WORD_SIZE = sizeof(word_t) * 8 };
word_t data[N/32 + 1];
inline int bindex(int b) { return b/WORD_SIZE; }
inline int boffset(int b) { return b % WORD_SIZE; }
void set_bit(int b) {
data[bindex(b)] |= 1 << (boffset(b));
}
void clear_bit(int b) {
data[bindex(b)] &= ~(1 << (boffset(b)));
}
int get_bit(int b) {
return data[bindex(b)] & (1 << (boffset(b));
}
void clear_all() { /* set all elements of data to zero */ }
void set_all() { /* set all elements of data to one */ }
लिखा है, यह थोड़ा कच्चे तेल के बाद से यह एक निश्चित आकार के साथ केवल एक ही वैश्विक bitset लागू करता है । इन समस्याओं का समाधान करने के लिए, आप निम्नलिखित की तरह एक डेटा struture कुछ के साथ शुरू करना चाहते हैं:
struct bitset { word_t *words; int nwords; };
और फिर बना सकते हैं और इन bitsets नष्ट करने के लिए कार्य करता है लिखते हैं।
struct bitset *bitset_alloc(int nbits) {
struct bitset *bitset = malloc(sizeof(*bitset));
bitset->nwords = (n/WORD_SIZE + 1);
bitset->words = malloc(sizeof(*bitset->words) * bitset->nwords);
bitset_clear(bitset);
return bitset;
}
void bitset_free(struct bitset *bitset) {
free(bitset->words);
free(bitset);
}
अब, यह अपेक्षाकृत एक struct bitset *
पैरामीटर लेने के लिए पिछले कार्यों को संशोधित करने के सीधा है। अपने जीवनकाल के दौरान एक बिटसेट को फिर से आकार देने का कोई तरीका नहीं है, न ही कोई सीमा जांच रही है, लेकिन इस बिंदु पर न तो जोड़ना मुश्किल होगा।
स्रोत
2010-04-13 22:13:28
मैं काफी यकीन है कि तुम क्या मतलब है जब आप कहते हैं कि एक "नियमित पूर्णांक/चार बिटमास्क" बहुत साफ जब सरणी लंबाई डेटा प्रकार लंबाई से अधिक नहीं है नहीं कर रहा हूँ? मैंने नीचे एक पारंपरिक सी बिटसेट कार्यान्वयन पोस्ट किया है, क्योंकि मैं सी/सी ++ समाधान और आपके कथन के लिए आपके अनुरोध की व्याख्या करता हूं कि 'std :: vector' यह इंगित करने के लिए अनुपलब्ध है कि आपको सीधे सी समाधान की आवश्यकता हो सकती है। –