2015-07-09 8 views
8

मुझे अपने डेटा का प्रतिनिधित्व करने के लिए केवल एक बिट की आवश्यकता है - 1 या 0. सी में ऐसा करने का सबसे अच्छा तरीका क्या है? "सामान्य" डेटा प्रकार बहुत बड़े हैं।सबसे छोटा डेटा प्रकार - क्या मैं एक बिट चर परिभाषित कर सकता हूं?

+1

स्मृति इतनी दुर्लभ है कि आप अलग-अलग बिट्स के रूप में मान संग्रहीत करने की आवश्यकता है? आप इसके लिए क्या उपयोग कर रहे हैं? शायद एक बेहतर तरीका है। –

उत्तर

5

यदि आप वास्तव में चाहते हैं, तो आप एक सदस्य चर, bit-fielded से 1 बिट के साथ एक संरचना बना सकते हैं।

याद रखें, सदस्य चर के डेटा प्रकार को unsigned होना चाहिए, क्योंकि आपको 0 और 1 स्टोर करने की आवश्यकता है।

10

आप

typedef struct foo 
{ 
    unsigned x:1; 
} foo; 

आप कहाँ संकलक है कि आप केवल x में से एक बिट का उपयोग किया जाएगा बता दिया है बना सकते हैं।

लेकिन संरचना पैकिंग व्यवस्था के कारण (सी मानक जानबूझकर लचीला है ताकि संकलक मशीन आर्किटेक्चर के अनुसार अनुकूलित कर सकें), यह अच्छी तरह से हो सकता है कि यह नियमित रूप से unsigned और स्मृति के रूप में स्मृति में जितनी अधिक जगह पर कब्जा कर लेता है foo एस की सरणी को थोड़ा सा संगत नहीं होना चाहिए।

0

आम तौर पर, सी में डेटा का सबसे छोटा पता योग्य हिस्सा एक बाइट है। आपके पास थोड़ा पॉइंटर नहीं हो सकता है, इसलिए आप 1 बिट आकार के चर को घोषित नहीं कर सकते हैं। लेकिन जैसा कि सौरव घोष ने पहले से ही बताया है, आप बिटफील्ड घोषित कर सकते हैं, जहां एक बिट सीधे पहुंचा जा सकता है।

1

पोर्टेबल तरीका एक चर की परिभाषा है जो व्यक्तिगत बिट्स को झंडे के रूप में उपयोग किया जाता है।

#define FLAG_FOO 0 
    #define FLAG_BAR 1 

    // in case platform does not support uint8_t 
    typedef unsigned char uint8_t; 

    uint8_t flags; 

    void flag_foo_set() 
    { 
     flags |= (1 << FLAG_FOO); 
    } 

    void flag_foo_clr() 
    { 
     flags &= ~(1 << FLAG_FOO); 
    } 

    uint8_t flag_foo_get() 
    { 
     return flags & (1 << FLAG_FOO); 
    } 

हालांकि यह सी बिट फ़ील्ड की तुलना में सुपरफ्लूओ प्रतीत हो सकता है। यह मूल रूप से प्रत्येक एएनएसआई सी संकलक के लिए पोर्टेबल है।

+1

बहुत pedantically, 'uint8_t' ** है ** द्वारा * हर * एएनएसआई सी संकलक समर्थित होना है? मैं पूरी तरह से यकीन नहीं कर रहा हूँ। 'हस्ताक्षरित चार' एक बेहतर विकल्प हो सकता है। – Bathsheba

+2

नहीं है, uintX_t प्रकार केवल C99 के लिए आवश्यक हैं - पूर्ण पोर्टेबिलिटी के लिए, अहस्ताक्षरित char' –

+1

'typedef अहस्ताक्षरित चार uint8_t का उपयोग'; 'मेरे लिए संभावित खतरनाक लगता है। – Bathsheba

3

यदि आपको लाखों इन झंडे की आवश्यकता नहीं है या अत्यधिक सीमित स्मृति बाधाएं हैं, तो सबसे अच्छा तरीका निश्चित रूप से int है।

ऐसा इसलिए है क्योंकि int आमतौर पर आपके प्लेटफ़ॉर्म के प्राकृतिक शब्द आकार से मेल खाता है और ठीक से गठबंधन किया जा सकता है, जल्दी से पहुंचा जा सकता है। मशीन किसी भी समय एक शब्द पढ़ती है और एकल बिट्स का उपयोग करके मास्किंग और स्थानांतरण की आवश्यकता होती है, जिसकी लागत समय होती है। रैम के गीगाबाइट्स के साथ अपने ठेठ पीसी पर, यह सिर्फ मूर्खतापूर्ण होगा।

स्मृति खपत वास्तव में एक मुद्दा है, तो bitfield संरचनाएं हैं।

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

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