बिट फ़ील्ड

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

फ़ील्ड के भीतर अलग-अलग बिट्स का अर्थ प्रोग्रामर द्वारा निर्धारित किया जाता है; उदाहरण के लिए, बिट फ़ील्ड में पहला बिट (फ़ील्ड के आधार पते पर स्थित) का उपयोग कभी-कभी बिट फ़ील्ड से जुड़े किसी विशेष विशेषता की स्थिति निर्धारित करने के लिए किया जाता है। CPU और अन्य तार्किक उपकरणों के भीतर, फ़्लैग नामक बिट फ़ील्ड का संग्रह आमतौर पर विशेष संचालन के परिणाम को नियंत्रित करने या इंगित करने के लिए उपयोग किया जाता है। प्रोसेसर के पास एक  स्थिति रजिस्टर  होता है जो झंडों से बना होता है। उदाहरण के लिए, यदि किसी जोड़ का परिणाम गंतव्य में प्रदर्शित नहीं किया जा सकता है तो अंकगणितीय अतिप्रवाह सेट किया जाता है। झंडे का उपयोग बाद के संचालन, जैसे सशर्त शाखा (कंप्यूटर विज्ञान) को तय करने के लिए किया जा सकता है। उदाहरण के लिए, एक शाखा (कंप्यूटर विज्ञान)| (यदि समान हो तो कूदें) x86 असेंबली भाषा में निर्देश#प्रोग्राम प्रवाह के परिणामस्वरूप छलांग लगेगी यदि स्टेटस रजिस्टर|जेड (शून्य) ध्वज किसी पिछले ऑपरेशन द्वारा सेट किया गया था।

एक बिट फ़ील्ड को बिट सरणी से अलग किया जाता है जिसमें बाद वाले का उपयोग पूर्णांक द्वारा अनुक्रमित बिट्स के एक बड़े सेट को संग्रहीत करने के लिए किया जाता है और यह अक्सर भाषा द्वारा समर्थित किसी भी अभिन्न प्रकार से व्यापक होता है। दूसरी ओर, बिट फ़ील्ड आमतौर पर मशीन वर्ड (डेटा प्रकार) में फिट होते हैं, और बिट्स का निरूपण उनके संख्यात्मक सूचकांक से स्वतंत्र है।

कार्यान्वयन
बिट फ़ील्ड का उपयोग मेमोरी खपत को कम करने के लिए किया जा सकता है जब किसी प्रोग्राम को कई पूर्णांक चर की आवश्यकता होती है जिसमें हमेशा कम मान होंगे। उदाहरण के लिए, कई प्रणालियों में पूर्णांक मान संग्रहीत करने के लिए दो बाइट्स (16-बिट्स) मेमोरी की आवश्यकता होती है; कभी-कभी संग्रहीत किए जाने वाले मानों को वास्तव में केवल एक या दो बिट्स की आवश्यकता होती है। इनमें से कई छोटे वेरिएबल्स को एक बिट फ़ील्ड साझा करने से मेमोरी में डेटा की कुशल पैकेजिंग की अनुमति मिलती है। C और C++ में, मूल कार्यान्वयन-परिभाषित बिट फ़ील्ड का उपयोग करके बनाया जा सकता है,  , या (सी99 में). इस मामले में, प्रोग्रामर एक बिट फ़ील्ड के लिए एक संरचना घोषित कर सकता है जो कई उपक्षेत्रों की चौड़ाई को लेबल और निर्धारित करता है। समान प्रकार के आसन्न घोषित बिट फ़ील्ड को कंपाइलर द्वारा कम शब्दों में पैक किया जा सकता है, यदि प्रत्येक 'फ़ील्ड' को अलग से घोषित किया जाता है तो उपयोग की जाने वाली मेमोरी की तुलना में।

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

सी प्रोग्रामिंग भाषा
C (प्रोग्रामिंग भाषा) और C++ में बिट फ़ील्ड घोषित करना: सी में बिट फ़ील्ड का लेआउट  अनिर्दिष्ट व्यवहार है|कार्यान्वयन-परिभाषित। ऐसे व्यवहार के लिए जो सभी कंपाइलरों में पूर्वानुमानित रहता है, आदिम और बिट ऑपरेटरों के साथ बिट फ़ील्ड का अनुकरण करना बेहतर हो सकता है:

प्रोसेसर स्थिति रजिस्टर
प्रोसेसर का स्टेटस रजिस्टर एक बिट फ़ील्ड है जिसमें कई फ़्लैग बिट्स होते हैं। प्रत्येक फ़्लैग बिट प्रोसेसर की वर्तमान स्थिति के बारे में जानकारी का वर्णन करता है। उदाहरण के तौर पर, एमओएस टेक्नोलॉजी 6502 प्रोसेसर का स्टेटस रजिस्टर नीचे दिखाया गया है:

ये बिट्स किसी ऑपरेशन के परिणाम के बाद प्रोसेसर द्वारा सेट किए जाते हैं। कुछ बिट्स (जैसे कैरी, इंटरप्ट-डिसेबल और दशमलव झंडे) को सेट और स्पष्ट निर्देशों का उपयोग करके स्पष्ट रूप से नियंत्रित किया जा सकता है। इसके अतिरिक्त, ध्वज की वर्तमान स्थिति के आधार पर निष्पादन को बदलने के लिए ब्रांचिंग निर्देशों को भी परिभाषित किया गया है।

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

ध्वज शब्दों से अंश निकालना
ध्वज फ़ील्ड में झंडे का एक उपसमूह मास्क (कंप्यूटिंग) के साथ तार्किक संयोजन द्वारा निकाला जा सकता है। बड़ी संख्या में भाषाएँ तार्किक बदलाव  ऑपरेटर (<<) का समर्थन करती हैं   एक बिट को nवें स्थान पर संरेखित करता है। अधिकांश एक या अधिक बिट्स के मान को अलग करने के लिए लॉजिकल कंजंक्शन ऑपरेटर (&) के उपयोग का भी समर्थन करते हैं।

यदि किसी डिवाइस से स्टेटस-बाइट 0x67 है और 5वां फ़्लैग बिट डेटा-रेडी को इंगित करता है। मास्क-बाइट है $$2^5 = 0x20$$. स्थिति-बाइट 0x67 का तार्किक संयोजन ( बाइनरी में) मास्क-बाइट 0x20 के साथ(  बाइनरी में) का मूल्यांकन 0x20 है। इसका मतलब है कि फ़्लैग बिट सेट है यानी डिवाइस में डेटा तैयार है। यदि फ़्लैग-बिट सेट नहीं किया गया होता, तो इसका मूल्यांकन 0 होता यानी डिवाइस से कोई डेटा उपलब्ध नहीं होता।

एक वेरिएबल v से nth बिट की जाँच करने के लिए, ऑपरेशन करें: बूल nth_is_set = (v & (1 << n)) != 0; बूल nth_is_set = (v >> n) और 1;

ध्वज शब्दों में बिट्स बदलना
फ़्लैग में बिट्स लिखना, पढ़ना या टॉगल करना केवल OR, AND और NOT ऑपरेशंस का उपयोग करके किया जा सकता है - ऑपरेशंस जिन्हें प्रोसेसर में जल्दी से निष्पादित किया जा सकता है। एक बिट सेट करने के लिए, तार्किक संचालक  एक मास्क बाइट के साथ स्टेटस बाइट देता है। मास्क बाइट या स्टेटस बाइट में सेट किया गया कोई भी बिट परिणाम में सेट किया जाएगा।

थोड़ा टॉगल करने के लिए, स्टेटस बाइट और मास्क बाइट को विशिष्ट विभक्ति  करें। यदि इसे साफ़ किया जाए तो यह थोड़ा सेट हो जाएगा या सेट होने पर यह थोड़ा साफ़ हो जाएगा।

यह भी देखें

 * बाइनरी कोड
 * बिटबोर्ड, शतरंज और इसी तरह के खेलों में उपयोग किया जाता है
 * बिट सरणी (या बिट स्ट्रिंग)
 * शब्द (कंप्यूटर वास्तुकला)
 * मास्क (कंप्यूटिंग)
 * कार्यक्रम स्थिति शब्द
 * स्थिति रजिस्टर
 * झंडे रजिस्टर (कंप्यूटिंग)
 * नियंत्रण रजिस्टर

बाहरी संबंध

 * Explanation from a book
 * Description from another wiki
 * Use case in a C++ guide
 * C++ libbit bit library (alternative URL)
 * Bit Twiddling Hacks: Several snippets of C code manipulating bit fields