इस सेक्शन में हम देखेंगे कि 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