बिट फ़ील्ड: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{Short description|Data structure in computer programming}}
{{Short description|Data structure in computer programming}}
[[ अंश |अंश]] फ़ील्ड [[डेटा संरचना]] है जिसमें या अधिक आसन्न बिट्स होते हैं जिन्हें विशिष्ट उद्देश्यों के लिए आवंटित किया गया है, ताकि संरचना के भीतर किसी भी बिट या बिट्स के समूह को सेट या निरीक्षण किया जा सके।<ref name="BrummBrumm1988">{{cite book|author1=Penn Brumm|author2=Don Brumm|title=80386 Assembly Language: A Complete Tutorial and Subroutine Library|url=https://books.google.com/books?id=qjkiAQAAIAAJ|date=August 1988|publisher=McGraw-Hill School Education Group|isbn=978-0-8306-9047-3|page=606}}</ref><ref name="Oualline1997">{{cite book|author=Steve Oualline|title=प्रैक्टिकल सी प्रोग्रामिंग|url=https://archive.org/details/practicalcprogra00oual_0|url-access=registration|year=1997|publisher="O'Reilly Media, Inc."|isbn=978-1-56592-306-5|pages=[https://archive.org/details/practicalcprogra00oual_0/page/403 403]–}}</ref> बिट फ़ील्ड का उपयोग आमतौर पर ज्ञात, निश्चित बिट-चौड़ाई जैसे एकल-बिट [[बूलियन डेटा प्रकार]] के [[आदिम डेटा प्रकार]]ों को दर्शाने के लिए किया जाता है।
'''[[ अंश |बिट]] क्षेत्र''' [[डेटा संरचना]] है जिसमें या अधिक आसन्न बिट होते हैं जिन्हें विशिष्ट उद्देश्यों के लिए आवंटित किया गया है, ताकि संरचना के भीतर किसी भी बिट या बिट के समूह को समूह या निरीक्षण किया जा सके।<ref name="BrummBrumm1988">{{cite book|author1=Penn Brumm|author2=Don Brumm|title=80386 Assembly Language: A Complete Tutorial and Subroutine Library|url=https://books.google.com/books?id=qjkiAQAAIAAJ|date=August 1988|publisher=McGraw-Hill School Education Group|isbn=978-0-8306-9047-3|page=606}}</ref><ref name="Oualline1997">{{cite book|author=Steve Oualline|title=प्रैक्टिकल सी प्रोग्रामिंग|url=https://archive.org/details/practicalcprogra00oual_0|url-access=registration|year=1997|publisher="O'Reilly Media, Inc."|isbn=978-1-56592-306-5|pages=[https://archive.org/details/practicalcprogra00oual_0/page/403 403]–}}</ref> अतः बिट क्षेत्र का उपयोग सामान्यतः ज्ञात, निश्चित बिट-चौड़ाई जैसे एकल-बिट [[बूलियन डेटा प्रकार]] के [[आदिम डेटा प्रकार|आदिम डेटा प्रकारों]] को दर्शाने के लिए किया जाता है।


फ़ील्ड के भीतर अलग-अलग बिट्स का अर्थ प्रोग्रामर द्वारा निर्धारित किया जाता है; उदाहरण के लिए, बिट फ़ील्ड में पहला बिट (फ़ील्ड के आधार पते पर स्थित) का उपयोग कभी-कभी बिट फ़ील्ड से जुड़े किसी विशेष विशेषता की स्थिति निर्धारित करने के लिए किया जाता है।<ref name="Miller1992">{{cite book|author=Michael A. Miller|title=The 68000 Microprocessor Family: Architecture, Programming, and Applications|url=https://books.google.com/books?id=6qAkAQAAIAAJ|date=January 1992|publisher=Merrill|isbn=978-0-02-381560-7|page=323}}</ref>
इस प्रकार से क्षेत्र के भीतर अलग-अलग बिट का अर्थ प्रोग्रामर द्वारा निर्धारित किया जाता है; इस प्रकार से उदाहरण के लिए, बिट क्षेत्र में प्रथम बिट (क्षेत्र के आधार एड्रेस पर स्थित) का उपयोग कभी-कभी बिट क्षेत्र से जुड़े किसी विशेष विशेषता की स्थिति निर्धारित करने के लिए किया जाता है।<ref name="Miller1992">{{cite book|author=Michael A. Miller|title=The 68000 Microprocessor Family: Architecture, Programming, and Applications|url=https://books.google.com/books?id=6qAkAQAAIAAJ|date=January 1992|publisher=Merrill|isbn=978-0-02-381560-7|page=323}}</ref>
[[ CPU ]] और अन्य तार्किक उपकरणों के भीतर, फ़्लैग नामक बिट फ़ील्ड का संग्रह आमतौर पर विशेष संचालन के परिणाम को नियंत्रित करने या इंगित करने के लिए उपयोग किया जाता है।<ref name="GriffithsAdams2010">{{cite book|author1=Ian Griffiths|author2=Matthew Adams|author3=Jesse Liberty|title=Programming C# 4.0: Building Windows, Web, and RIA Applications for the .NET 4.0 Framework|url=https://books.google.com/books?id=8graYKZ7rhIC&pg=PA81|date=30 July 2010|publisher="O'Reilly Media, Inc."|isbn=978-1-4493-9972-6|pages=81–}}</ref> प्रोसेसर के पास [[ स्थिति रजिस्टर ]] होता है जो झंडों से बना होता है। उदाहरण के लिए, यदि किसी जोड़ का परिणाम गंतव्य में प्रदर्शित नहीं किया जा सकता है तो अंकगणितीय अतिप्रवाह सेट किया जाता है। झंडे का उपयोग बाद के संचालन, जैसे सशर्त [[शाखा (कंप्यूटर विज्ञान)]] को तय करने के लिए किया जा सकता है। उदाहरण के लिए, शाखा (कंप्यूटर विज्ञान)|<syntaxhighlight lang="asm" inline>JE ...</syntaxhighlight>(यदि समान हो तो कूदें) x86 असेंबली भाषा में निर्देश#प्रोग्राम प्रवाह के परिणामस्वरूप छलांग लगेगी यदि स्टेटस रजिस्टर|जेड (शून्य) ध्वज किसी पिछले ऑपरेशन द्वारा सेट किया गया था।
 
अतः [[ CPU |सीपीयू]] और अन्य तार्किक उपकरणों के भीतर, फ़्लैग नामक बिट क्षेत्र का संग्रह सामान्यतः विशेष संचालन के परिणाम को नियंत्रित करने या इंगित करने के लिए उपयोग किया जाता है।<ref name="GriffithsAdams2010">{{cite book|author1=Ian Griffiths|author2=Matthew Adams|author3=Jesse Liberty|title=Programming C# 4.0: Building Windows, Web, and RIA Applications for the .NET 4.0 Framework|url=https://books.google.com/books?id=8graYKZ7rhIC&pg=PA81|date=30 July 2010|publisher="O'Reilly Media, Inc."|isbn=978-1-4493-9972-6|pages=81–}}</ref> प्रोसेसर के निकट [[ स्थिति रजिस्टर |स्थिति रजिस्टर]] होता है जो '''फ्लैग''' से बना होता है। इस प्रकार से उदाहरण के लिए, यदि किसी जोड़ का परिणाम गंतव्य में निष्पादित नहीं किया जा सकता है तो अंकगणितीय अतिप्रवाह समूह किया जाता है। फ्लैग का उपयोग बाद के संचालन, जैसे सप्रतिबन्ध [[शाखा (कंप्यूटर विज्ञान)]] को निर्धारित करने के लिए किया जा सकता है। इस प्रकार से उदाहरण के लिए, यदि किसी पिछले संक्रिया द्वारा Z (शून्य) फ्लैग सेट किया गया था, तो x86 असेंबली भाषा में एक <syntaxhighlight lang="asm" inline="">JE ...</syntaxhighlight>(समान होने पर कूदें) निर्देश का परिणाम सम्मिलित होगा।
 
अतः एक बिट क्षेत्र को [[बिट सरणी]] से अलग किया जाता है जिसमें बाद वाले का उपयोग पूर्णांक द्वारा अनुक्रमित बिट के बड़े समूह को संग्रहीत करने के लिए किया जाता है और यह प्रायः भाषा द्वारा समर्थित किसी भी अभिन्न प्रकार से व्यापक होता है। इस प्रकार से दूसरी ओर, बिट क्षेत्र सामान्यतः मशीन वर्ड (डेटा प्रकार) में फिट होते हैं,<ref name="Miller1992" />और बिट का निरूपण उनके संख्यात्मक सूचकांक से स्वतंत्र है।<ref name="Oualline1997" />


एक बिट फ़ील्ड को [[बिट सरणी]] से अलग किया जाता है जिसमें बाद वाले का उपयोग पूर्णांक द्वारा अनुक्रमित बिट्स के बड़े सेट को संग्रहीत करने के लिए किया जाता है और यह अक्सर भाषा द्वारा समर्थित किसी भी अभिन्न प्रकार से व्यापक होता है।{{citation needed|date=January 2019}} दूसरी ओर, बिट फ़ील्ड आमतौर पर मशीन वर्ड (डेटा प्रकार) में फिट होते हैं,<ref name="Miller1992" />और बिट्स का निरूपण उनके संख्यात्मक सूचकांक से स्वतंत्र है।<ref name="Oualline1997" />




==कार्यान्वयन==
==कार्यान्वयन==
बिट फ़ील्ड का उपयोग मेमोरी खपत को कम करने के लिए किया जा सकता है जब किसी प्रोग्राम को कई पूर्णांक चर की आवश्यकता होती है जिसमें हमेशा कम मान होंगे। उदाहरण के लिए, कई प्रणालियों में पूर्णांक मान संग्रहीत करने के लिए दो बाइट्स (16-बिट्स) मेमोरी की आवश्यकता होती है; कभी-कभी संग्रहीत किए जाने वाले मानों को वास्तव में केवल या दो बिट्स की आवश्यकता होती है। इनमें से कई छोटे वेरिएबल्स को बिट फ़ील्ड साझा करने से मेमोरी में डेटा की कुशल पैकेजिंग की अनुमति मिलती है।<ref name="Mimar1991">{{cite book|author=Tibet Mimar|title=Programming and Designing with the 68000 Family: Including 68000, 68010/12, 68020, and the 68030|url=https://books.google.com/books?id=arFQAAAAMAAJ|year=1991|publisher=Prentice Hall|isbn=978-0-13-731498-0|page=275}}</ref>
अतः बिट क्षेत्र का उपयोग मेमोरी व्यय को कम करने के लिए किया जा सकता है जब किसी प्रोग्राम को कई पूर्णांक चर की आवश्यकता होती है जिसमें सदैव कम मान होंगे। इस प्रकार से उदाहरण के लिए, कई प्रणालियों में पूर्णांक मान संग्रहीत करने के लिए दो बाइट (16-बिट) मेमोरी की आवश्यकता होती है; कभी-कभी संग्रहीत किए जाने वाले मानों को वस्तुतः मात्र या दो बिट की आवश्यकता होती है। इस प्रकार से इनमें से कई छोटे चर को बिट क्षेत्र साझा करने से मेमोरी में डेटा की कुशल पैकेजिंग की अनुमति मिलती है।<ref name="Mimar1991">{{cite book|author=Tibet Mimar|title=Programming and Designing with the 68000 Family: Including 68000, 68010/12, 68020, and the 68030|url=https://books.google.com/books?id=arFQAAAAMAAJ|year=1991|publisher=Prentice Hall|isbn=978-0-13-731498-0|page=275}}</ref>
C और C++ में, मूल कार्यान्वयन-परिभाषित बिट फ़ील्ड का उपयोग करके बनाया जा सकता है <code>unsigned int</code>, <code>signed int</code>, या (सी99 में) <code>_Bool</code>. इस मामले में, प्रोग्रामर बिट फ़ील्ड के लिए संरचना घोषित कर सकता है जो कई उपक्षेत्रों की चौड़ाई को लेबल और निर्धारित करता है।<ref name="Prata 2007">{{cite book|last=Prata|first=Stephen|title=सी प्राइम मोर|year=2007|publisher=Sams|location=Indianapolis, Ind|isbn=978-0-672-32696-7|edition=5th}}</ref> समान प्रकार के आसन्न घोषित बिट फ़ील्ड को कंपाइलर द्वारा कम शब्दों में पैक किया जा सकता है, यदि प्रत्येक 'फ़ील्ड' को अलग से घोषित किया जाता है तो उपयोग की जाने वाली मेमोरी की तुलना में।
 
अतः C और C++ में, मूल कार्यान्वयन-परिभाषित बिट क्षेत्र <code>unsigned int</code>, <code>signed int</code>, या (सी99 में) <code>_Bool</code> का उपयोग करके बनाया जा सकता है। इस स्थिति में, प्रोग्रामर बिट क्षेत्र के लिए संरचना घोषित कर सकता है जो कई उपक्षेत्रों की चौड़ाई को लेबल और निर्धारित करता है।<ref name="Prata 2007">{{cite book|last=Prata|first=Stephen|title=सी प्राइम मोर|year=2007|publisher=Sams|location=Indianapolis, Ind|isbn=978-0-672-32696-7|edition=5th}}</ref> इस प्रकार से समान प्रकार के आसन्न घोषित बिट क्षेत्र को कंपाइलर द्वारा कम शब्दों में पैक किया जा सकता है, यदि प्रत्येक 'क्षेत्र' को अलग से घोषित किया जाता है तो उपयोग की जाने वाली मेमोरी की तुलना में।


उन भाषाओं के लिए जिनमें मूल बिट फ़ील्ड की कमी है, या जहां प्रोग्रामर परिणामी बिट प्रतिनिधित्व पर नियंत्रण चाहता है, बड़े शब्द प्रकार के भीतर बिट्स को मैन्युअल रूप से हेरफेर करना संभव है। इस मामले में, प्रोग्रामर [[मास्क (कंप्यूटिंग)]] और [[बिटवाइज़ संचालन]] के संयोजन का उपयोग करके फ़ील्ड में बिट्स सेट, परीक्षण और बदल सकता है।<ref name="Daggett2013">{{cite book|author=Mark E. Daggett|title=विशेषज्ञ जावास्क्रिप्ट|url=https://books.google.com/books?id=MPBZAgAAQBAJ&pg=PA68|date=13 November 2013|publisher=Apress|isbn=978-1-4302-6097-4|pages=68–}}</ref>
उन भाषाओं के लिए जिनमें मूल बिट क्षेत्र की कमी है, या जहां प्रोग्रामर परिणामी बिट प्रतिनिधित्व पर नियंत्रण चाहता है, बड़े शब्द प्रकार के भीतर बिट को मैन्युअल रूप से परिवर्तन करना संभव है। इस प्रकार से इस स्थिति में, प्रोग्रामर [[मास्क (कंप्यूटिंग)]] और [[बिटवाइज़ संचालन]] के संयोजन का उपयोग करके क्षेत्र में बिट समूह, परीक्षण और बदल सकता है।<ref name="Daggett2013">{{cite book|author=Mark E. Daggett|title=विशेषज्ञ जावास्क्रिप्ट|url=https://books.google.com/books?id=MPBZAgAAQBAJ&pg=PA68|date=13 November 2013|publisher=Apress|isbn=978-1-4302-6097-4|pages=68–}}</ref>
==उदाहरण==
==उदाहरण==


===सी प्रोग्रामिंग भाषा===
===सी प्रोग्रामिंग भाषा===
C (प्रोग्रामिंग भाषा) और [[C++]] में बिट फ़ील्ड घोषित करना:<ref name="Prata 2007"/>
इस प्रकार से C (प्रोग्रामिंग भाषा) और [[C++]] में बिट क्षेत्र घोषित करना:<ref name="Prata 2007"/>
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
// opaque and show
// opaque and show
Line 55: Line 58:
};
};
</syntaxhighlight>
</syntaxhighlight>
सी में बिट फ़ील्ड का लेआउट <code>struct</code> [[अनिर्दिष्ट व्यवहार]] है|कार्यान्वयन-परिभाषित। ऐसे व्यवहार के लिए जो सभी कंपाइलरों में पूर्वानुमानित रहता है, आदिम और बिट ऑपरेटरों के साथ बिट फ़ील्ड का अनुकरण करना बेहतर हो सकता है:
सी <code>struct</code> में बिट क्षेत्र का लेआउट [[अनिर्दिष्ट व्यवहार|कार्यान्वयन-परिभाषित]] है। इस प्रकार से ऐसे व्यवहार के लिए जो सभी कंपाइलरों में पूर्वानुमानित रहता है, आदिम और बिट प्रचालकों के साथ बिट क्षेत्र का अनुकरण करना ठीक हो सकता है:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
/* Each of these preprocessor directives defines a single bit,
/* Each of these preprocessor directives defines a single bit,
Line 90: Line 93:
</syntaxhighlight>
</syntaxhighlight>


===प्रोसेसर स्थिति रजिस्टर===
===प्रोसेसर अवस्था रजिस्टर===
प्रोसेसर का स्टेटस रजिस्टर बिट फ़ील्ड है जिसमें कई फ़्लैग बिट्स होते हैं। प्रत्येक फ़्लैग बिट प्रोसेसर की वर्तमान स्थिति के बारे में जानकारी का वर्णन करता है।<ref>{{cite book|title=इनसाइडर|url=https://books.google.com/books?id=AFpRAAAAYAAJ|date=January 1986|publisher=W. Green|page=108}}</ref> उदाहरण के तौर पर, [[एमओएस टेक्नोलॉजी 6502]] प्रोसेसर का स्टेटस रजिस्टर नीचे दिखाया गया है:
अतः प्रोसेसर की अवस्था रजिस्टर बिट क्षेत्र है जिसमें कई फ़्लैग बिट होते हैं। प्रत्येक फ़्लैग बिट प्रोसेसर की वर्तमान स्थिति के विषय में सूचना का वर्णन करता है।<ref>{{cite book|title=इनसाइडर|url=https://books.google.com/books?id=AFpRAAAAYAAJ|date=January 1986|publisher=W. Green|page=108}}</ref> इस प्रकार से उदाहरण के लिए, [[एमओएस टेक्नोलॉजी 6502]] प्रोसेसर की अवस्था रजिस्टर निम्न दिखाया गया है:


{| class="wikitable"
{| class="wikitable"
|+ 6502 status register
|+ 6502 अवस्था रजिस्टर
|-
|-
! Bit 7 !! Bit 6 !! Bit 5 !! Bit 4 !! Bit 3 !! Bit 2 !! Bit 1 !! Bit 0
! बिट 7 !! बिट 6 !! बिट 5 !! बिट 4 !! बिट 3 !! बिट 2 !! बिट 1 !! बिट 0
|-
|-
| '''N'''egative flag || o'''V'''erflow flag || - || '''B'''reak flag || '''D'''ecimal flag || '''I'''nterrupt-disable flag || '''Z'''ero flag || '''C'''arry flag
| '''N'''egative flag || o'''V'''erflow flag || - || '''B'''reak flag || '''D'''ecimal flag || '''I'''nterrupt-disable flag || '''Z'''ero flag || '''C'''arry flag
|}
|}
ये बिट्स किसी ऑपरेशन के परिणाम के बाद प्रोसेसर द्वारा सेट किए जाते हैं। कुछ बिट्स (जैसे कैरी, इंटरप्ट-डिसेबल और दशमलव झंडे) को सेट और स्पष्ट निर्देशों का उपयोग करके स्पष्ट रूप से नियंत्रित किया जा सकता है। इसके अतिरिक्त, ध्वज की वर्तमान स्थिति के आधार पर निष्पादन को बदलने के लिए ब्रांचिंग निर्देशों को भी परिभाषित किया गया है।
इस प्रकार से ये बिट किसी संक्रिया के परिणाम के बाद प्रोसेसर द्वारा समूह किए जाते हैं। कुछ बिट (जैसे कैरी, इंटरप्ट-डिसेबल और दशमलव फ्लैग) को समूह और स्पष्ट निर्देशों का उपयोग करके स्पष्ट रूप से नियंत्रित किया जा सकता है। अतः इसके अतिरिक्त, फ्लैग की वर्तमान स्थिति के आधार पर निष्पादन को बदलने के लिए ब्रांचिंग निर्देशों को भी परिभाषित किया गया है।


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


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


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


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


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


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


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


Line 136: Line 139:
* [http://c2.com/cgi/wiki?BitField Description from another wiki]
* [http://c2.com/cgi/wiki?BitField Description from another wiki]
* [https://web.archive.org/web/20080203070726/http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=131 Use case in a C++ guide]
* [https://web.archive.org/web/20080203070726/http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=131 Use case in a C++ guide]
* [https://web.archive.org/web/20070428213243/http://libbit.sourceforge.net/ C++ libbit bit library] ([http://sourceforge.net/projects/libbit/ alternative URL])
* [https://web.archive.org/web/20070428213243/http://libbit.sourceforge.net/ C++ libबिट बिट library] ([http://sourceforge.net/projects/libbit/ alternative URL])
* [https://graphics.stanford.edu/~seander/bithacks.html Bit Twiddling Hacks]: Several snippets of C code manipulating bit fields  
* [https://graphics.stanford.edu/~seander/bithacks.html बिट Twiddling Hacks]: Several snippets of C code manipulating बिट fields  
[[Category: बिट डेटा संरचनाएँ]] [[Category: उदाहरण सी कोड वाले लेख]]  
[[Category: बिट डेटा संरचनाएँ]] [[Category: उदाहरण सी कोड वाले लेख]]  



Revision as of 23:44, 18 July 2023

बिट क्षेत्र डेटा संरचना है जिसमें या अधिक आसन्न बिट होते हैं जिन्हें विशिष्ट उद्देश्यों के लिए आवंटित किया गया है, ताकि संरचना के भीतर किसी भी बिट या बिट के समूह को समूह या निरीक्षण किया जा सके।[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.

बाहरी संबंध