2011-09-02 14 views
6

सी या सी ++ में, यह जाहिरा तौर पर संभव बिट्स एक चर है की संख्या को सीमित करने के लिए है, इसलिए, उदाहरण के लिए :बिट की स्थापना सवाल

unsigned char A:1; 
unsigned char B:3; 
unsigned char C:1; 
unsigned char D:3; 
  1. क्या इसके बाद के संस्करण तकनीक वास्तव में कहा जाता है:

    अगर मैं निम्न चर के साथ एक वर्ग है?

  2. आकार में चार बाइट्स से ऊपर है, या आकार में एक बाइट है?
  3. क्या वेरिएबल्स को दिखाए गए अनुसार 1 (या 3) बिट्स के रूप में माना जाता है, या 'हस्ताक्षरित चार' के अनुसार, प्रत्येक बाइट के रूप में माना जाता है?
  4. क्या केंद्रीकृत बाइट में बिट्स को जोड़ने का कोई तरीका है? तो उदाहरण के लिए:

unsigned char MainByte; 
unsigned char A:1; //Can this be made to point at the first bit in MainByte? 
unsigned char B:3; //Etc etc 
unsigned char C:1; 
unsigned char D:3; 
  1. वहाँ एक लेख है कि और अधिक गहराई में इस विषय को शामिल किया गया है?
  2. यदि 'ए: 1' को पूरे बाइट की तरह माना जाता है, तो इसका बिंदु/बैंगनी क्या है?

किसी भी अन्य विचारों (जैसे कंपाइलर प्रतिबंध या अन्य सीमाओं) का उल्लेख करने के लिए स्वतंत्र महसूस करें।

धन्यवाद।

+3

जो नाम आप खोज रहे हैं वह है बिटफील्ड –

+0

मुझे लगता है कि मुझे पूछना चाहिए: क्या आप सी या सी ++ का उपयोग कर रहे हैं? और यदि सी ++, क्या आप इसे गैर-पीओडी कक्षा में उपयोग कर रहे हैं? मुझे एहसास है कि सी ++ बिटफील्ड को पीओडी संरचना प्रकारों में प्रतिबंधित करता है। –

+0

सी ++। मैं btoh सहित हूँ इसलिए मैं दोनों विनिर्देशों के मतभेदों को जानता हूं (और लागू समाधानों को विस्तारित करने के लिए)। और हाँ, मैं इसे कक्षा में उपयोग कर रहा हूं (हालांकि इस समय यह डिज़ाइन चरण है), अगर इसे केवल एक स्ट्रक्चर के रूप में उपयोग किया जा सकता है, तो मैं आसानी से बदल सकता हूं। यह एक जीआईएफ छवि लोडिंग कार्यक्रम के लिए। – SSight3

उत्तर

8

उपर्युक्त तकनीक वास्तव में क्या कहा जाता है?

बिटफील्ड। और आपको केवल int (signed, unsigned या अन्यथा) का उपयोग करना चाहिए, "प्रकार" के रूप में, char नहीं।

आकार में चार बाइट्स से ऊपर या आकार में एक बाइट ऊपर है?

न तो। यह शायद sizeof(int) है क्योंकि संकलक एक शब्द-आकार वाली वस्तु उत्पन्न करता है। हालांकि, वास्तविक बिटफील्ड को बाइट के भीतर संग्रहीत किया जाएगा। यह बस कुछ जगह बर्बाद कर देगा।

क्या वेरिएबल्स दिखाए गए अनुसार 1 (या 3) बिट्स के रूप में या 'हस्ताक्षरित चार' के रूप में माना जाता है, प्रत्येक बाइट के रूप में माना जाता है?

वे केवल निर्दिष्ट बिट्स का प्रतिनिधित्व करते हैं, और यथासंभव कसकर पैक किए जाएंगे।

क्या किसी केंद्रीकृत बाइट में बिट्स को जोड़ने का कोई तरीका है? उदाहरण के लिए तो:

उपयोग एक union:

struct bits { 
    unsigned A:1; 
    unsigned B:3; 
    unsigned C:1; 
    unsigned D:3; 
}; 

union SplitByte { 
    struct bits Bits; 
    unsigned char Byte[sizeof(struct bits)]; 
    /* the array is a trick so the two fields 
    are guaranteed to be the same size and 
    thus be aligned on the same boundary */ 
} SplitByteObj; 

// access the byte 
SplitByteObj.Byte[0] 

// access a bitfield 
SplitByteObj.Bits.B 

नोट bitfields के साथ समस्याओं जब धागे का उपयोग कर उदाहरण के लिए देखते हैं कि,। प्रत्येक बिटफील्ड को व्यक्तिगत रूप से एक्सेस नहीं किया जा सकता है, इसलिए यदि आप उनमें से प्रत्येक की रक्षा करने के लिए mutex का उपयोग करने का प्रयास करते हैं तो आपको त्रुटियां मिल सकती हैं। साथ ही, जिस क्रम में फ़ील्ड रखी गई हैं वह मानक द्वारा स्पष्ट रूप से निर्दिष्ट नहीं है। बहुत से लोग उस कारण से मैन्युअल रूप से बिटफील्ड को लागू करने के लिए बिटवाई ऑपरेटरों का उपयोग करना पसंद करते हैं।

क्या कोई ऐसा लेख है जो इस विषय को अधिक गहराई से कवर करता है?

बहुत से नहीं। जब आप Google को प्राप्त करेंगे तो आपको पहले कुछ मिलेंगे। वे व्यापक रूप से उपयोग किए जाने वाले निर्माण नहीं हैं। मानक के बारे में पता लगाने के लिए आप मानक से नापसंद कर सकते हैं कि वे वास्तव में कैसे काम करते हैं ताकि आप एक अजीब किनारे के मामले से काट नहीं पाएंगे। मैं आपको बिल्कुल बता नहीं सकता कि मानक में वे कहां निर्दिष्ट हैं।

यदि 'ए: 1' को पूरे बाइट की तरह माना जाता है, तो इसका बिंदु/बैंगनी क्या है?

ऐसा नहीं है, लेकिन मैंने इसे पहले ही संबोधित किया है।

+0

+1 "int" के रूप में उपयोग int (हस्ताक्षरित, हस्ताक्षरित या अन्यथा) के लिए +1, char नहीं। – Sadique

+0

सी 99 6.7.2.1/10 में बहुत अधिक आवश्यकताएं निर्धारित की गई हैं। बहुत सारी आवश्यकताएं नहीं हैं। –

+0

बहुत गहन जानकारी के लिए धन्यवाद। – SSight3

5

ये बिट-फ़ील्ड हैं।

स्मृति में इन क्षेत्रों को व्यवस्थित करने के तरीके के विवरण बड़े पैमाने पर कार्यान्वयन-परिभाषित हैं। आम तौर पर, आप पाएंगे कि संकलक उन्हें किसी भी तरह से पैक करता है। लेकिन यह विभिन्न संरेखण मुद्दों को ध्यान में रख सकता है।

+0

आपके योगदान के लिए धन्यवाद। – SSight3

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