2011-11-28 15 views
5

मुझे बिटसेट से बाइट्स निकालने की आवश्यकता है जो (नहीं) में CHAR_BIT बिट्स का एक से अधिक हो सकता है। अब मैं बिसेट में कितने बिट्स को एक सरणी में डालना चाहता हूं। उदाहरण के लिए,मैं बिट्सट को बाइट्स/uint8 की सरणी में कैसे परिवर्तित करूं?

बिट्स सेट घोषित किया जाता है के रूप में std::bitset < 40> id;

एक अलग चर nBitsid में कैसे बिट्स के कई प्रयोग करने योग्य हैं। अब मैं उन बिट्स को CHAR_BIT के गुणकों में निकालना चाहता हूं। मुझे उन मामलों की देखभाल करने की भी आवश्यकता है जहां nBits % CHAR_BIT != 0। मैं इसे uint8

+2

हर्ष ... यदि आपके पास आकार (हस्ताक्षर किए गए लंबे) बिट्स से कम था, तो यह 'बिट्ससेट :: to_ulong' का उपयोग करके सीधा होगा। जैसा कि है, मुझे नहीं लगता कि एक सरल समाधान है। 'std :: bitset' में' std :: vector' के रूप में 'डेटा()' जैसे कुछ नहीं है (हालांकि जीसीसी संस्करण में एक अनियंत्रित और प्रयोगात्मक '_M_getdata' फ़ंक्शन है जो कि ...)'। चूंकि कोई अन्य चीज नहीं है, इसलिए आप अलग-अलग बिट्स को अलग-अलग एक्सेस कर सकते हैं। या, एक स्ट्रिंग को क्रमबद्ध करें या स्ट्रीम के माध्यम से जाएं, लेकिन इनमें से कोई भी विशेष रूप से कुशल नहीं है। – Damon

उत्तर

3

दुर्भाग्य से भाषा में कोई अच्छा तरीका नहीं है, मान लीजिए कि आपको unsigned long में बिट्स की संख्या की आवश्यकता है (इस मामले में आप to_ulong का उपयोग कर सकते हैं)। आपको सभी बिट्स पर फिर से शुरू करना होगा और बाइट्स की सरणी उत्पन्न करनी होगी।

15

आप boost::dynamic_bitset का उपयोग कर सकते हैं, जिसे boost::to_block_range का उपयोग करके "ब्लॉक" की एक श्रृंखला में परिवर्तित किया जा सकता है।

#include <cstdlib> 
#include <cstdint> 
#include <iterator> 
#include <vector> 
#include <boost/dynamic_bitset.hpp> 

int main() 
{ 
    typedef uint8_t Block; // Make the block size one byte 
    typedef boost::dynamic_bitset<Block> Bitset; 

    Bitset bitset(40); // 40 bits 

    // Assign random bits 
    for (int i=0; i<40; ++i) 
    { 
     bitset[i] = std::rand() % 2; 
    } 

    // Copy bytes to buffer 
    std::vector<Block> bytes; 
    boost::to_block_range(bitset, std::back_inserter(bytes)); 
} 
+0

यह देखने के लिए एक गोचा यह है कि वेक्टर के आंतरिक प्रकार को ब्लॉक प्रकार से मिलान करने की आवश्यकता होती है जिसका उपयोग बिसेटसेट (इस मामले में, 'हस्ताक्षरित चार') बनाने के लिए किया जाता था। यदि बिटसेट में 4-बाइट ब्लॉक हैं लेकिन वेक्टर में 1-बाइट ब्लॉक हैं, तो 'to_block' चुपचाप प्रत्येक ब्लॉक के बाद के 3 बाइट्स को काट देगा। तो, एमिल के जवाब में 'std :: vector <बिट्सैट :: ब्लॉक> बाइट्स' के वेक्टर घोषणा को बदलने के लिए कुछ हद तक सुरक्षित है। – prideout

+0

मेरी टिप्पणी में सुधार: आंतरिक प्रकार 'बिट्ससेट :: ब्लॉक_ टाइप 'है, न कि' बिटसेट :: ब्लॉक'। – prideout

+0

@prideout: आपके द्वारा वर्णित स्थिति से बचने के लिए 'ब्लॉक' टाइपपीफ जोड़ा गया। –

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

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