बिट फ़ील्ड

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

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

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

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

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

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

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

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

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

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

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

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

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

इस प्रकार से एक चर v से nवें बिट की जाँच करने के लिए, संक्रिया करें: बूल 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++ libबिट बिट library (alternative URL)
 * बिट Twiddling Hacks: Several snippets of C code manipulating बिट fields