बिट फ़ील्ड

From Vigyanwiki

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

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

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

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


कार्यान्वयन

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

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

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

उदाहरण

सी प्रोग्रामिंग लैंग्वेज

इस प्रकार से C (प्रोग्रामिंग लैंग्वेज) और C++ में बिट क्षेत्र घोषित करना:[6]

// opaque and show
#define YES 1
#define NO  0

// line styles
#define SOLID  1
#define DOTTED 2
#define DASHED 3

// primary colors
#define BLUE  0b100
#define GREEN 0b010
#define RED   0b001

// mixed colors
#define BLACK   0                    /* 000 */
#define YELLOW  (RED | GREEN)        /* 011 */
#define MAGENTA (RED | BLUE)         /* 101 */
#define CYAN    (GREEN | BLUE)       /* 110 */
#define WHITE   (RED | GREEN | BLUE) /* 111 */

const char* colors[8] = {"Black", "Red", "Green", "Yellow", "Blue", "Magenta", "Cyan", "White"};

// bit field box properties
struct BoxProps
{
  unsigned int  opaque       : 1;
  unsigned int  fill_color   : 3;
  unsigned int               : 4; // fill to 8 bits
  unsigned int  show_border  : 1;
  unsigned int  border_color : 3;
  unsigned int  border_style : 2;
  unsigned char              : 0; // fill to nearest byte (16 bits)
  unsigned char width        : 4, // Split a byte into 2 fields of 4 bits
                height       : 4;
};

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

/* Each of these preprocessor directives defines a single bit,
   corresponding to one button on the controller.  
   Button order matches that of the Nintendo Entertainment System. */
#define KEY_RIGHT  0b00000001
#define KEY_LEFT   0b00000010
#define KEY_DOWN   0b00000100
#define KEY_UP     0b00001000
#define KEY_START  0b00010000
#define KEY_SELECT 0b00100000
#define KEY_B      0b01000000
#define KEY_A      0b10000000

unsigned char gameControllerStatus = 0;

/* Sets the gameControllerStatus using OR */
void KeyPressed(unsigned char key) 
{ 
  gameControllerStatus |= key; 
}

/* Clears the gameControllerStatus using AND and ~ (binary NOT)*/
void KeyReleased(unsigned char key) 
{ 
  gameControllerStatus &= ~key; 
}

/* Tests whether a bit is set using AND */
unsigned char IsPressed(unsigned char key) 
{ 
  return gameControllerStatus & key; 
}

प्रोसेसर अवस्था रजिस्टर

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

6502 अवस्था रजिस्टर
बिट 7 बिट 6 बिट 5 बिट 4 बिट 3 बिट 2 बिट 1 बिट 0
Negative flag oVerflow flag - Break flag Decimal flag Interrupt-disable flag Zero flag Carry flag

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

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

फ्लैग शब्दों से बिट उद्धरण

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

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

इस प्रकार से एक चर v से nवें बिट की जाँच करने के लिए, संक्रिया करें:

बूल nth_is_set = (v & (1 << n)) != 0;
बूल nth_is_set = (v >> n) और 1;

फ्लैग शब्दों में बिट परिवर्तित करना

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

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

यह भी देखें

संदर्भ

  1. Penn Brumm; Don Brumm (August 1988). 80386 Assembly Language: A Complete Tutorial and Subroutine Library. McGraw-Hill School Education Group. p. 606. ISBN 978-0-8306-9047-3.
  2. 2.0 2.1 Steve Oualline (1997). प्रैक्टिकल सी प्रोग्रामिंग. "O'Reilly Media, Inc.". pp. 403–. ISBN 978-1-56592-306-5.
  3. 3.0 3.1 Michael A. Miller (January 1992). The 68000 Microprocessor Family: Architecture, Programming, and Applications. Merrill. p. 323. ISBN 978-0-02-381560-7.
  4. Ian Griffiths; Matthew Adams; Jesse Liberty (30 July 2010). Programming C# 4.0: Building Windows, Web, and RIA Applications for the .NET 4.0 Framework. "O'Reilly Media, Inc.". pp. 81–. ISBN 978-1-4493-9972-6.
  5. Tibet Mimar (1991). Programming and Designing with the 68000 Family: Including 68000, 68010/12, 68020, and the 68030. Prentice Hall. p. 275. ISBN 978-0-13-731498-0.
  6. 6.0 6.1 Prata, Stephen (2007). सी प्राइम मोर (5th ed.). Indianapolis, Ind: Sams. ISBN 978-0-672-32696-7.
  7. Mark E. Daggett (13 November 2013). विशेषज्ञ जावास्क्रिप्ट. Apress. pp. 68–. ISBN 978-1-4302-6097-4.
  8. इनसाइडर. W. Green. January 1986. p. 108.

बाहरी संबंध