बिट फ़ील्ड
अंश फ़ील्ड एक डेटा संरचना है जिसमें एक या अधिक आसन्न बिट्स होते हैं जिन्हें विशिष्ट उद्देश्यों के लिए आवंटित किया गया है, ताकि संरचना के भीतर किसी भी एक बिट या बिट्स के समूह को सेट या निरीक्षण किया जा सके।[1][2] बिट फ़ील्ड का उपयोग आमतौर पर ज्ञात, निश्चित बिट-चौड़ाई जैसे एकल-बिट बूलियन डेटा प्रकार के आदिम डेटा प्रकारों को दर्शाने के लिए किया जाता है।
फ़ील्ड के भीतर अलग-अलग बिट्स का अर्थ प्रोग्रामर द्वारा निर्धारित किया जाता है; उदाहरण के लिए, बिट फ़ील्ड में पहला बिट (फ़ील्ड के आधार पते पर स्थित) का उपयोग कभी-कभी बिट फ़ील्ड से जुड़े किसी विशेष विशेषता की स्थिति निर्धारित करने के लिए किया जाता है।[3]
CPU और अन्य तार्किक उपकरणों के भीतर, फ़्लैग नामक बिट फ़ील्ड का संग्रह आमतौर पर विशेष संचालन के परिणाम को नियंत्रित करने या इंगित करने के लिए उपयोग किया जाता है।[4] प्रोसेसर के पास एक स्थिति रजिस्टर होता है जो झंडों से बना होता है। उदाहरण के लिए, यदि किसी जोड़ का परिणाम गंतव्य में प्रदर्शित नहीं किया जा सकता है तो अंकगणितीय अतिप्रवाह सेट किया जाता है। झंडे का उपयोग बाद के संचालन, जैसे सशर्त शाखा (कंप्यूटर विज्ञान) को तय करने के लिए किया जा सकता है। उदाहरण के लिए, एक शाखा (कंप्यूटर विज्ञान)|JE ...
(यदि समान हो तो कूदें) x86 असेंबली भाषा में निर्देश#प्रोग्राम प्रवाह के परिणामस्वरूप छलांग लगेगी यदि स्टेटस रजिस्टर|जेड (शून्य) ध्वज किसी पिछले ऑपरेशन द्वारा सेट किया गया था।
एक बिट फ़ील्ड को बिट सरणी से अलग किया जाता है जिसमें बाद वाले का उपयोग पूर्णांक द्वारा अनुक्रमित बिट्स के एक बड़े सेट को संग्रहीत करने के लिए किया जाता है और यह अक्सर भाषा द्वारा समर्थित किसी भी अभिन्न प्रकार से व्यापक होता है।[citation needed] दूसरी ओर, बिट फ़ील्ड आमतौर पर मशीन वर्ड (डेटा प्रकार) में फिट होते हैं,[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;
}
This article may require cleanup to meet Wikipedia's quality standards. The specific problem is: moved from Flag field. (May 2016) (Learn how and when to remove this template message) |
प्रोसेसर स्थिति रजिस्टर
प्रोसेसर का स्टेटस रजिस्टर एक बिट फ़ील्ड है जिसमें कई फ़्लैग बिट्स होते हैं। प्रत्येक फ़्लैग बिट प्रोसेसर की वर्तमान स्थिति के बारे में जानकारी का वर्णन करता है।[8] उदाहरण के तौर पर, एमओएस टेक्नोलॉजी 6502 प्रोसेसर का स्टेटस रजिस्टर नीचे दिखाया गया है:
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|---|---|
Negative flag | oVerflow flag | - | Break flag | Decimal flag | Interrupt-disable flag | Zero flag | Carry flag |
ये बिट्स किसी ऑपरेशन के परिणाम के बाद प्रोसेसर द्वारा सेट किए जाते हैं। कुछ बिट्स (जैसे कैरी, इंटरप्ट-डिसेबल और दशमलव झंडे) को सेट और स्पष्ट निर्देशों का उपयोग करके स्पष्ट रूप से नियंत्रित किया जा सकता है। इसके अतिरिक्त, ध्वज की वर्तमान स्थिति के आधार पर निष्पादन को बदलने के लिए ब्रांचिंग निर्देशों को भी परिभाषित किया गया है।
उदाहरण के लिए, एक के बाद ADC
(कैरी के साथ जोड़ें) अनुदेश, BVS
(ओवरफ्लो सेट पर शाखा) निर्देश का उपयोग इस आधार पर कूदने के लिए किया जा सकता है कि अतिरिक्त निर्देश के परिणाम के बाद प्रोसेसर द्वारा ओवरफ्लो ध्वज सेट किया गया था या नहीं।
ध्वज शब्दों से अंश निकालना
ध्वज फ़ील्ड में झंडे का एक उपसमूह मास्क (कंप्यूटिंग) के साथ तार्किक संयोजन द्वारा निकाला जा सकता है। बड़ी संख्या में भाषाएँ तार्किक बदलाव ऑपरेटर (<<) का समर्थन करती हैं 1 << n
एक बिट को nवें स्थान पर संरेखित करता है। अधिकांश एक या अधिक बिट्स के मान को अलग करने के लिए लॉजिकल कंजंक्शन ऑपरेटर (&) के उपयोग का भी समर्थन करते हैं।
यदि किसी डिवाइस से स्टेटस-बाइट 0x67 है और 5वां फ़्लैग बिट डेटा-रेडी को इंगित करता है। मास्क-बाइट है . स्थिति-बाइट 0x67 का तार्किक संयोजन (0110 0111
बाइनरी में) मास्क-बाइट 0x20 के साथ(0010 0000
बाइनरी में) का मूल्यांकन 0x20 है। इसका मतलब है कि फ़्लैग बिट सेट है यानी डिवाइस में डेटा तैयार है। यदि फ़्लैग-बिट सेट नहीं किया गया होता, तो इसका मूल्यांकन 0 होता यानी डिवाइस से कोई डेटा उपलब्ध नहीं होता।
एक वेरिएबल v से nth बिट की जाँच करने के लिए, ऑपरेशन करें:
बूल nth_is_set = (v & (1 << n)) != 0; बूल nth_is_set = (v >> n) और 1;
ध्वज शब्दों में बिट्स बदलना
फ़्लैग में बिट्स लिखना, पढ़ना या टॉगल करना केवल OR, AND और NOT ऑपरेशंस का उपयोग करके किया जा सकता है - ऑपरेशंस जिन्हें प्रोसेसर में जल्दी से निष्पादित किया जा सकता है। एक बिट सेट करने के लिए, तार्किक संचालक एक मास्क बाइट के साथ स्टेटस बाइट देता है। मास्क बाइट या स्टेटस बाइट में सेट किया गया कोई भी बिट परिणाम में सेट किया जाएगा।
थोड़ा टॉगल करने के लिए, स्टेटस बाइट और मास्क बाइट को विशिष्ट विभक्ति करें। यदि इसे साफ़ किया जाए तो यह थोड़ा सेट हो जाएगा या सेट होने पर यह थोड़ा साफ़ हो जाएगा।
यह भी देखें
- बाइनरी कोड
- बिटबोर्ड, शतरंज और इसी तरह के खेलों में उपयोग किया जाता है
- बिट सरणी (या बिट स्ट्रिंग)
- शब्द (कंप्यूटर वास्तुकला)
- मास्क (कंप्यूटिंग)
- कार्यक्रम स्थिति शब्द
- स्थिति रजिस्टर
- झंडे रजिस्टर (कंप्यूटिंग)
- नियंत्रण रजिस्टर
संदर्भ
- ↑ 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.0 2.1 Steve Oualline (1997). प्रैक्टिकल सी प्रोग्रामिंग. "O'Reilly Media, Inc.". pp. 403–. ISBN 978-1-56592-306-5.
- ↑ 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.
- ↑ 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.
- ↑ 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.0 6.1 Prata, Stephen (2007). सी प्राइम मोर (5th ed.). Indianapolis, Ind: Sams. ISBN 978-0-672-32696-7.
- ↑ Mark E. Daggett (13 November 2013). विशेषज्ञ जावास्क्रिप्ट. Apress. pp. 68–. ISBN 978-1-4302-6097-4.
- ↑ इनसाइडर. W. Green. January 1986. p. 108.
बाहरी संबंध
- 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