Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C में बिट फील्ड्स


इस सेक्शन में हम देखेंगे कि C में बिट फील्ड्स क्या हैं।

मान लीजिए आपके C प्रोग्राम में कई TRUE/FALSE वेरिएबल्स हैं जिन्हें status नामक एक स्ट्रक्चर में समूहित किया गया है, जैसा कि नीचे दिखाया गया है −

struct {
    unsigned int widthValidated;
    unsigned int heightValidated;
} status;

इस स्ट्रक्चर को 8 बिट्स मेमोरी स्पेस की आवश्यकता होती है लेकिन वास्तव में, हम प्रत्येक वेरिएबल में केवल 0 या 1 स्टोर करने जा रहे हैं। C प्रोग्रामिंग भाषा ऐसी स्थितियों में मेमोरी स्पेस का बेहतर उपयोग करने का एक बेहतर तरीका प्रदान करती है।

यदि आप ऐसे वेरिएबल्स को स्ट्रक्चर के अंदर उपयोग कर रहे हैं तो आप एक वेरिएबल की चौड़ाई परिभाषित कर सकते हैं जो C कंपाइलर को बताता है कि आप केवल उतने ही बिट्स का उपयोग करने जा रहे हैं। उदाहरण के लिए, उपरोक्त स्ट्रक्चर को निम्नानुसार पुनः लिखा जा सकता है −

struct {
    unsigned int widthValidated : 1;
    unsigned int heightValidated : 1;
} status;

उपरोक्त स्ट्रक्चर को status वेरिएबल के लिए 4 बिट्स मेमोरी स्पेस की आवश्यकता होती है, लेकिन मान स्टोर करने के लिए केवल 2 बिट्स उपयोग किए जाएंगे।

यदि आप 32 वेरिएबल्स तक उपयोग करते हैं जिनमें से प्रत्येक की चौड़ाई 1 बिट है, तब भी status स्ट्रक्चर 4 बिट्स का उपयोग करेगा। हालांकि जैसे ही आपके पास 33 वेरिएबल्स होंगे, यह मेमोरी के अगले स्लॉट को आवंटित करेगा और 8 बिट्स का उपयोग करना शुरू कर देगा। आइए निम्नलिखित उदाहरण से इस अवधारणा को समझें −

उदाहरण कोड

#include <stdio.h>
#include <string.h>

/* साधारण स्ट्रक्चर परिभाषित करें */
struct {
    unsigned int widthValidated;
    unsigned int heightValidated;
} status1;

/* बिट फील्ड्स के साथ स्ट्रक्चर परिभाषित करें */
struct {
    unsigned int widthValidated : 1;
    unsigned int heightValidated : 1;
} status2;

int main() {
    printf("Memory size occupied by status1 : %d\n", sizeof(status1));
    printf("Memory size occupied by status2 : %d\n", sizeof(status2));
    return 0;
}

आउटपुट

Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

बिट फील्ड घोषणा:

स्ट्रक्चर के अंदर बिट-फील्ड की घोषणा का निम्नलिखित रूप होता है −

struct {
    type [member_name] : width ;
};

निम्न तालिका बिट फील्ड के वेरिएबल तत्वों का वर्णन करती है −

तत्वविवरण
typeएक पूर्णांक प्रकार जो निर्धारित करता है कि बिट-फील्ड के मान की व्याख्या कैसे की जाती है। प्रकार int, signed int, या unsigned int हो सकता है।
member_nameबिट-फील्ड का नाम।
widthबिट-फील्ड में बिट्स की संख्या। चौड़ाई निर्दिष्ट प्रकार की बिट चौड़ाई से कम या बराबर होनी चाहिए।

पूर्वनिर्धारित चौड़ाई के साथ परिभाषित वेरिएबल्स को बिट फील्ड्स कहा जाता है। एक बिट फील्ड एक से अधिक बिट रख सकता है; उदाहरण के लिए, यदि आपको 0 से 7 तक का मान स्टोर करने के लिए एक वेरिएबल की आवश्यकता है, तो आप 3 बिट्स की चौड़ाई वाला बिट फील्ड परिभाषित कर सकते हैं जैसे कि −

struct {
    unsigned int age : 3;
} Age;

उपरोक्त स्ट्रक्चर परिभाषा C कंपाइलर को निर्देश देती है कि age वेरिएबल मान स्टोर करने के लिए केवल 3 बिट्स का उपयोग करने जा रहा है। यदि आप 3 बिट्स से अधिक उपयोग करने का प्रयास करते हैं, तो यह आपको ऐसा करने की अनुमति नहीं देगा। आइए निम्नलिखित उदाहरण आज़माएं −

उदाहरण कोड

#include <stdio.h>
#include <string.h>

struct {
    unsigned int age : 3;
} Age;

int main() {
    Age.age = 4;
    printf("Sizeof( Age ) : %d\n", sizeof(Age));
    printf("Age.age : %d\n", Age.age);
    Age.age = 7;
    printf("Age.age : %d\n", Age.age);
    Age.age = 8;
    printf("Age.age : %d\n", Age.age);
    return 0;
}

आउटपुट

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0
  1. C ग्राफिक्स: bar() फ़ंक्शन C ग्राफिक्स: bar() फ़ंक्शन

    bar() फ़ंक्शन bar() C ग्राफिक्स में एक फ़ंक्शन है जो एक भरा हुआ आयत (बार) खींचता है। यह graphics.h हेडर फ़ाइल में परिभाषित है। सिंटैक्स void bar(int left, int top, int right, int bottom); पैरामीटर left, top: ऊपरी-बाएं कोने के निर्देशांक (x, y) right, bottom: निचले-दाएं कोने के निर्देशांक (x, y)

  1. C में सरणी की रेंज का गुणनफल (मॉड्यूलो के साथ) C में सरणी की रेंज का गुणनफल (मॉड्यूलो के साथ)

    एक सरणी, L, R, P दिए गए हैं। कार्य L और R के बीच के तत्वों का गुणनफल मॉड्यूलो P के साथ निकालना है। उदाहरण: इनपुट: A[] = {1, 2, 3, 4, 5, 6}, P = 29, L = 2, R = 6 आउटपुट: 24 इनपुट: A[] = {1, 2, 3, 4, 5, 6}, L = 2, R = 5, P = 113 आउटपुट: 7 दृष्टिकोण सरणी, L, R, P को इनपुट लें। L से R तक के तत्वों को

  1. C/C++ में मल्टीडायमेंशनल ऐरे C/C++ में मल्टीडायमेंशनल ऐरे

    C/C++ में, मल्टीडायमेंशनल ऐरे को सरल शब्दों में ऐरे के ऐरे के रूप में परिभाषित किया जाता है। मल्टीडायमेंशनल ऐरे में डेटा टेबुलर फॉर्म में स्टोर होता है (रो मेजर ऑर्डर में)। निम्नलिखित डायग्राम 3 x 3 x 3 डायमेंशन वाले मल्टीडायमेंशनल ऐरे के लिए मेमोरी आवंटन रणनीति दिखाता है। एल्गोरिदम Begin ऐर