बिट प्रकलन: Difference between revisions
No edit summary |
No edit summary |
||
(10 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{Short description|Algorithmically modifying data below the word level}} | {{Short description|Algorithmically modifying data below the word level}} | ||
[[ अंश | | '''[[ अंश |बिट]] प्रकलन''' एक [[शब्द (डेटा प्रकार)]] से कम बिट्स या [[डेटा (कंप्यूटिंग)]] के अन्य टुकड़ों को [[ कलन विधि | कलन विधि]] से छेड़छाड़ करने का कार्य है। इस प्रकार [[कंप्यूटर प्रोग्रामिंग]] कार्यों में बिट प्रकलन की आवश्यकता होती है जिसमें निम्न-स्तरीय उपकरण नियंत्रण, त्रुटि का पता लगाने और [[त्रुटि सुधार]] एल्गोरिदम, डेटा संपीड़न, [[ कूटलेखन | एन्क्रिप्शन]] एल्गोरिदम और [[अनुकूलन (कंप्यूटर विज्ञान)]] सम्मिलित हैं। अधिकांश अन्य कार्यों के लिए, आधुनिक [[प्रोग्रामिंग भाषा]]एँ [[प्रोग्रामर]] को उन बिट्स के बजाय सीधे एब्स्ट्रैक्शन के साथ काम करने की अनुमति देती हैं जो उन एब्स्ट्रैक्शन का प्रतिनिधित्व करते हैं। | ||
स्रोत कोड जो बिट | स्रोत कोड जो बिट प्रकलन करता है बिटवाइज़ संचालन का उपयोग करता है: एं, OR, XOR, NOT और संभवतः बूलियन ऑपरेटरों के अनुरूप अन्य संचालन; [[बिटवाइज़ ऑपरेशन]] एक और शून्य को गिनने, उच्च और निम्न एक या शून्य को खोजने, बिट्स को सेट करने, रीसेट करने और परीक्षण करने, फ़ील्ड्स निकालने और डालने, मास्क और शून्य फ़ील्ड्स को समूहित करने और बिट्स को निर्दिष्ट बिट स्थितियों या फ़ील्ड्स से समूहित करने और बिखेरने के लिए बिट शिफ्ट और ऑपरेशन भी हैं। | ||
बिट | इस प्रकार पूर्णांक अंकगणितीय ऑपरेटर अन्य ऑपरेटरों के साथ मिलकर बिट-संचालन को भी प्रभावित कर सकते हैं। | ||
बिट प्रकलन, कुछ स्थितियों में, डेटा संरचना पर लूप की आवश्यकता को कम या कम कर सकता है और कई गुना गति दे सकता है, क्योंकि बिट प्रकलन को समानांतर में संसाधित किया जाता है। | |||
== शब्दावली == | == शब्दावली == | ||
बिट ट्विडलिंग, बिट फिडलिंग और बिट बैशिंग का उपयोग अधिकांशतः बिट मैनीपुलेशन के साथ एक दूसरे के स्थान पर किया जाता है, किन्तु कभी-कभी विशेष रूप से चतुर या गैर-स्पष्ट तरीकों या बिट | बिट ट्विडलिंग, बिट फिडलिंग और बिट बैशिंग का उपयोग अधिकांशतः बिट मैनीपुलेशन के साथ एक दूसरे के स्थान पर किया जाता है, किन्तु कभी-कभी विशेष रूप से चतुर या गैर-स्पष्ट तरीकों या बिट प्रकलन के उपयोग, या थकाऊ या चुनौतीपूर्ण उच्च और निम्न-स्तरीय डिवाइस नियंत्रण डेटा प्रकलन कार्यों को संदर्भित करता है। | ||
कंप्यूटिंग हार्डवेयर | बिट ट्विडलिंग शब्द प्रारंभिक कंप्यूटिंग हार्डवेयर से आया है, जहां कंप्यूटर ऑपरेटर कंप्यूटर नियंत्रणों में बदलाव या घुमा-फिरा कर समायोजन करते थे। इस प्रकार जैसे-जैसे कंप्यूटर प्रोग्रामिंग भाषाएं विकसित हुईं, प्रोग्रामर्स ने डेटा के किसी भी प्रबंधन के लिए इस शब्द को अपनाया जिसमें बिट-स्तरीय [[गणना]] सम्मिलित है। | ||
== बिटवाइज़ ऑपरेशन == | == बिटवाइज़ ऑपरेशन == | ||
एक बिटवाइज़ ऑपरेशन एक या एक से अधिक [[ थोड़ा अभ्यास ]] या बाइनरी अंक प्रणाली पर उनके व्यक्तिगत बिट्स के स्तर पर संचालित होता है। यह केंद्रीय प्रसंस्करण इकाई (सीपीयू) द्वारा सीधे समर्थित एक तेज़, आदिम क्रिया है | एक बिटवाइज़ ऑपरेशन एक या एक से अधिक [[ थोड़ा अभ्यास ]] या बाइनरी अंक प्रणाली पर उनके व्यक्तिगत बिट्स के स्तर पर संचालित होता है। इस प्रकार यह केंद्रीय प्रसंस्करण इकाई (सीपीयू) द्वारा सीधे समर्थित एक तेज़, आदिम क्रिया है और इसका उपयोग तुलना और गणना के लिए मूल्यों में प्रकलन करने के लिए किया जाता है। | ||
अधिकांश प्रोसेसरों पर, अधिकांश बिटवाइज़ ऑपरेशन एकल चक्र होते हैं - विभाजन और गुणन और शाखाओं की तुलना में अधिक | अधिकांश प्रोसेसरों पर, अधिकांश बिटवाइज़ ऑपरेशन एकल चक्र होते हैं - विभाजन और गुणन और शाखाओं की तुलना में अधिक तेज़ हैं। इस प्रकार जबकि आधुनिक प्रोसेसर सामान्यतः कुछ अंकगणितीय और तार्किक संचालन करते हैं, जितनी तेजी से उनके लंबे [[निर्देश पाइपलाइन]] और अन्य [[कंप्यूटर आर्किटेक्चर]] डिजाइन विकल्पों के कारण बिटवाइज़ संचालन होते हैं, संसाधनों के कम उपयोग के कारण बिटवाइज़ संचालन सामान्यतः कम बिजली का उपयोग करते हैं। | ||
== बिट | == बिट प्रकलन का उदाहरण == | ||
यह निर्धारित करने के लिए कि क्या कोई संख्या दो की | यह निर्धारित करने के लिए कि क्या कोई संख्या दो की घात है, वैचारिक रूप से हम बार-बार पूर्णांक को दो से विभाजित कर सकते हैं जब तक कि संख्या 2 से समान रूप से विभाजित नहीं होगी; यदि एकमात्र कारक बचा है तो 1 है, मूल संख्या 2 की घात थी। इस प्रकार बिट और तार्किक ऑपरेटरों का उपयोग करके, एक सरल अभिव्यक्ति है जो सही (1) या गलत (0) लौटाएगा: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
Line 29: | Line 30: | ||
एक्स और (एक्स-1) == 0...000...0 | एक्स और (एक्स-1) == 0...000...0 | ||
यदि संख्या न तो शून्य है और न ही दो की शक्ति है, तो इसमें एक से अधिक स्थानों पर '1' होगा: | इस प्रकार यदि संख्या न तो शून्य है और न ही दो की शक्ति है, तो इसमें एक से अधिक स्थानों पर '1' होगा: | ||
x == 0...<span style= color:red >1</span>...0<span style= color:red >1</span>0...0 | x == 0...<span style= color:red >1</span>...0<span style= color:red >1</span>0...0 | ||
x-1 == 0...<span style= color:red >1</span>...001...1 | x-1 == 0...<span style= color:red >1</span>...001...1 | ||
Line 36: | Line 37: | ||
यदि इनलाइन असेंबली भाषा कोड का उपयोग किया जाता है, तो एक निर्देश (पॉपकंट) जो ऑपरेंड में 1 या 0 की संख्या की गणना करता है, उपलब्ध हो सकता है; ठीक एक '1' बिट वाला ऑपरेंड 2 की शक्ति है। चूंकि, इस तरह के निर्देश में उपरोक्त बिटवाइज़ विधि की तुलना में अधिक विलंबता हो सकती है। | यदि इनलाइन असेंबली भाषा कोड का उपयोग किया जाता है, तो एक निर्देश (पॉपकंट) जो ऑपरेंड में 1 या 0 की संख्या की गणना करता है, उपलब्ध हो सकता है; ठीक एक '1' बिट वाला ऑपरेंड 2 की शक्ति है। चूंकि, इस तरह के निर्देश में उपरोक्त बिटवाइज़ विधि की तुलना में अधिक विलंबता हो सकती है। | ||
== बिट | == बिट प्रकलन संचालन == | ||
प्रोसेसर सामान्यतः उपयोगी बिट ऑपरेटरों का केवल एक सबसेट प्रदान करते हैं। प्रोग्रामिंग लैंग्वेज अधिकांश बिट ऑपरेशंस को सीधे | प्रोसेसर सामान्यतः उपयोगी बिट ऑपरेटरों का केवल एक सबसेट प्रदान करते हैं। प्रोग्रामिंग लैंग्वेज अधिकांश बिट ऑपरेशंस को सीधे समर्थन नहीं करती हैं, इसलिए उन्हें कोड करने के लिए मुहावरों का उपयोग किया जाना चाहिए। उदाहरण के लिए, 'सी' प्रोग्रामिंग भाषा केवल बिट-वार AND(&), OR(|), XOR(^) और NOT(~) प्रदान करती है। फोरट्रान AND(.and.), OR (.or.), XOR (.neqv.) और EQV(.eqv.) प्रदान करता है। इस प्रकार अल्गोल सिंटैक्टिक बिटफ़ील्ड एक्सट्रैक्ट और इंसर्ट प्रदान करता है। इस प्रकार जब भाषाएं बिट ऑपरेशंस प्रदान करती हैं जो सीधे हार्डवेयर निर्देशों को मैप नहीं करती हैं, तो कंपाइलर्स को उपलब्ध ऑपरेटरों से ऑपरेशन को संश्लेषित करना चाहिए। | ||
एक विशेष रूप से उपयोगी बिट ऑपरेशन एक मशीन शब्द के उच्च सेट बिट को खोजने के लिए उपयोग किए जाने वाले अग्रणी शून्यों की गिनती है, चूंकि विभिन्न आर्किटेक्चर पर इसके अलग-अलग नाम हो सकते हैं।<ref>On most Intel chips, it's BSR (bitscan reverse), though newer SoCs also have LZCNT (count leading zeros)</ref> कोई सरल प्रोग्रामिंग भाषा मुहावरा नहीं है, इसलिए इसे एक कंपाइलर इंट्रिंसिक या सिस्टम लाइब्रेरी रूटीन द्वारा प्रदान किया जाना चाहिए। उस ऑपरेटर के बिना, अंकगणितीय संचालन के असममित कैरी-प्रचार के कारण, किसी शब्द के उच्च बिट के संबंध में कोई भी ऑपरेशन करने के लिए यह बहुत महंगा है (पहला सेट # सीएलजेड देखें)। सौभाग्य से, अधिकांश सीपीयू आर्किटेक्चर ने 1980 के दशक के मध्य से प्रदान किया है। साथ में ऑपरेशन काउंट वाले, जिसे | एक विशेष रूप से उपयोगी बिट ऑपरेशन एक मशीन शब्द के उच्च सेट बिट को खोजने के लिए उपयोग किए जाने वाले अग्रणी शून्यों की गिनती है, चूंकि विभिन्न आर्किटेक्चर पर इसके अलग-अलग नाम हो सकते हैं।<ref>On most Intel chips, it's BSR (bitscan reverse), though newer SoCs also have LZCNT (count leading zeros)</ref> कोई सरल प्रोग्रामिंग भाषा मुहावरा नहीं है, इसलिए इसे एक कंपाइलर इंट्रिंसिक या सिस्टम लाइब्रेरी रूटीन द्वारा प्रदान किया जाना चाहिए। इस प्रकार उस ऑपरेटर के बिना, अंकगणितीय संचालन के असममित कैरी-प्रचार के कारण, किसी शब्द के उच्च बिट के संबंध में कोई भी ऑपरेशन करने के लिए यह बहुत महंगा है (पहला सेट # सीएलजेड देखें)। सौभाग्य से, अधिकांश सीपीयू आर्किटेक्चर ने 1980 के दशक के मध्य से प्रदान किया है। साथ में ऑपरेशन काउंट वाले, जिसे पॉपकाउंट भी कहा जाता है, जो मशीन शब्द में सेट बिट्स की संख्या की गणना करता है, सामान्यतः हार्डवेयर ऑपरेटर के रूप में भी प्रदान किया जाता है। इस प्रकार बिट सेट, रीसेट, टेस्ट और टॉगल जैसे सरल बिट ऑपरेशंस अधिकांशतः हार्डवेयर ऑपरेटरों के रूप में प्रदान किए जाते हैं, किन्तु यदि वे नहीं हैं तो आसानी से अनुकरण किए जाते हैं - उदाहरण के लिए (सेट R0, 1; एलएसएचएफटी आर0, आई; या एक्स, आर0) सेट बिट i ऑपरेंड एक्स में। | ||
कुछ अधिक उपयोगी और जटिल बिट ऑपरेशंस जिन्हें प्रोग्रामिंग भाषा में मुहावरों के रूप में कोडित किया जाना चाहिए और कंपाइलर्स द्वारा संश्लेषित में सम्मिलित हैं: | इस प्रकार कुछ अधिक उपयोगी और जटिल बिट ऑपरेशंस जिन्हें प्रोग्रामिंग भाषा में मुहावरों के रूप में कोडित किया जाना चाहिए और कंपाइलर्स द्वारा संश्लेषित में सम्मिलित हैं: | ||
* निर्दिष्ट बिट स्थिति से स्पष्ट ऊपर (शब्द के निचले हिस्से को छोड़ दें) | * निर्दिष्ट बिट स्थिति से स्पष्ट ऊपर (शब्द के निचले हिस्से को छोड़ दें) | ||
Line 49: | Line 50: | ||
* बिटफील्ड एक्सट्रैक्ट | * बिटफील्ड एक्सट्रैक्ट | ||
* बिटफील्ड डालें | * बिटफील्ड डालें | ||
*बिटफ़ील्ड स्कैटर/एकत्र संचालन जो मशीन शब्द पर बिटफ़ील्ड के सन्निहित भागों को वितरित करते हैं, या शब्द में अलग-अलग बिटफ़ील्ड को बिटफ़ील्ड के एक सन्निहित हिस्से में | *बिटफ़ील्ड स्कैटर/एकत्र संचालन जो मशीन शब्द पर बिटफ़ील्ड के सन्निहित भागों को वितरित करते हैं, या शब्द में अलग-अलग बिटफ़ील्ड को बिटफ़ील्ड के एक सन्निहित हिस्से में समूहित करते हैं (हाल ही के इंटेल पीईएक्सटी/पीडीईपी ऑपरेटरों को देखें)। क्रिप्टोग्राफी और वीडियो एन्कोडिंग द्वारा उपयोग किया जाता है। | ||
* मैट्रिक्स उलटा | * मैट्रिक्स उलटा | ||
कुछ अंकगणितीय संक्रियाओं को सरल संक्रियाओं और बिट संक्रियाओं में घटाया जा सकता है: | कुछ अंकगणितीय संक्रियाओं को सरल संक्रियाओं और बिट संक्रियाओं में घटाया जा सकता है: | ||
* शिफ्ट-ऐड के अनुक्रम के लिए स्थिरांक से गुणा कम करें | * शिफ्ट-ऐड के अनुक्रम के लिए स्थिरांक से गुणा कम करें | ||
उदाहरण के लिए 9 से गुणा करें, कॉपी ऑपरेंड है, 3 से शिफ्ट करें (8 से गुणा करें), और मूल ऑपरेंड में जोड़ें। | उदाहरण के लिए 9 से गुणा करें, कॉपी ऑपरेंड है, 3 से शिफ्ट करें (8 से गुणा करें), और मूल ऑपरेंड में जोड़ें। | ||
* शिफ्ट-घटाने के क्रम में निरंतर विभाजन को कम | * शिफ्ट-घटाने के क्रम में निरंतर विभाजन को कम करें। | ||
=== मास्किंग === | === मास्किंग === | ||
एक मुखौटा वह डेटा है जिसका उपयोग बिटवाइज़ संचालन के लिए किया जाता है, विशेष रूप से [[बिट फ़ील्ड]] | एक मुखौटा वह डेटा है जिसका उपयोग बिटवाइज़ संचालन के लिए किया जाता है, विशेष रूप से [[बिट फ़ील्ड]] में किया जाता है। | ||
मास्क का उपयोग करके, एक [[बाइट]], [[ कुतरना ]], [[वर्ड (कंप्यूटर आर्किटेक्चर)]] (आदि) में कई बिट्स को एक ही बिटवाइज़ ऑपरेशन में चालू, बंद या उलटा (या इसके विपरीत) सेट किया जा सकता है। मास्किंग के अधिक व्यापक अनुप्रयोग, जब संचालन के लिए सशर्त रूप से लागू होते हैं, तो उन्हें प्रिडिक्शन (कंप्यूटर आर्किटेक्चर) कहा जाता है। | मास्क का उपयोग करके, एक [[बाइट]], [[ कुतरना | निबल]], [[वर्ड (कंप्यूटर आर्किटेक्चर)]] (आदि) में कई बिट्स को एक ही बिटवाइज़ ऑपरेशन में चालू, बंद या उलटा (या इसके विपरीत) सेट किया जा सकता है। इस प्रकार मास्किंग के अधिक व्यापक अनुप्रयोग, जब संचालन के लिए सशर्त रूप से लागू होते हैं, तो उन्हें प्रिडिक्शन (कंप्यूटर आर्किटेक्चर) कहा जाता है। | ||
== यह भी देखें == | == यह भी देखें == | ||
Line 65: | Line 66: | ||
* [[थोड़ा पीटना]] | * [[थोड़ा पीटना]] | ||
* बिट फील्ड | * बिट फील्ड | ||
* [[बिट हेरफेर निर्देश सेट]] - x[[86]] निर्देश सेट के लिए बिट | * [[बिट हेरफेर निर्देश सेट|बिट प्रकलन निर्देश सेट]] - x[[86]] निर्देश सेट के लिए बिट प्रकलन एक्सटेंशन। | ||
* [[बिट विधेय]] | * [[बिट विधेय]] | ||
* [[बिट विशिष्टता (बहुविकल्पी)]] | * [[बिट विशिष्टता (बहुविकल्पी)]] | ||
Line 85: | Line 86: | ||
* [http://aggregate.org/MAGIC/ The Aggregate Magic Algorithms] from University of Kentucky | * [http://aggregate.org/MAGIC/ The Aggregate Magic Algorithms] from University of Kentucky | ||
{{DEFAULTSORT:Bit Manipulation}} | {{DEFAULTSORT:Bit Manipulation}} | ||
[[Category: Machine Translated Page]] | [[Category:Created On 19/06/2023|Bit Manipulation]] | ||
[[Category: | [[Category:Lua-based templates|Bit Manipulation]] | ||
[[Category:Machine Translated Page|Bit Manipulation]] | |||
[[Category:Pages with script errors|Bit Manipulation]] | |||
[[Category:Templates Vigyan Ready|Bit Manipulation]] | |||
[[Category:Templates that add a tracking category|Bit Manipulation]] | |||
[[Category:Templates that generate short descriptions|Bit Manipulation]] | |||
[[Category:Templates using TemplateData|Bit Manipulation]] | |||
[[Category:कंप्यूटर अंकगणित|Bit Manipulation]] | |||
[[Category:बाइनरी अंकगणित|Bit Manipulation]] |
Latest revision as of 14:12, 5 July 2023
बिट प्रकलन एक शब्द (डेटा प्रकार) से कम बिट्स या डेटा (कंप्यूटिंग) के अन्य टुकड़ों को कलन विधि से छेड़छाड़ करने का कार्य है। इस प्रकार कंप्यूटर प्रोग्रामिंग कार्यों में बिट प्रकलन की आवश्यकता होती है जिसमें निम्न-स्तरीय उपकरण नियंत्रण, त्रुटि का पता लगाने और त्रुटि सुधार एल्गोरिदम, डेटा संपीड़न, एन्क्रिप्शन एल्गोरिदम और अनुकूलन (कंप्यूटर विज्ञान) सम्मिलित हैं। अधिकांश अन्य कार्यों के लिए, आधुनिक प्रोग्रामिंग भाषाएँ प्रोग्रामर को उन बिट्स के बजाय सीधे एब्स्ट्रैक्शन के साथ काम करने की अनुमति देती हैं जो उन एब्स्ट्रैक्शन का प्रतिनिधित्व करते हैं।
स्रोत कोड जो बिट प्रकलन करता है बिटवाइज़ संचालन का उपयोग करता है: एं, OR, XOR, NOT और संभवतः बूलियन ऑपरेटरों के अनुरूप अन्य संचालन; बिटवाइज़ ऑपरेशन एक और शून्य को गिनने, उच्च और निम्न एक या शून्य को खोजने, बिट्स को सेट करने, रीसेट करने और परीक्षण करने, फ़ील्ड्स निकालने और डालने, मास्क और शून्य फ़ील्ड्स को समूहित करने और बिट्स को निर्दिष्ट बिट स्थितियों या फ़ील्ड्स से समूहित करने और बिखेरने के लिए बिट शिफ्ट और ऑपरेशन भी हैं।
इस प्रकार पूर्णांक अंकगणितीय ऑपरेटर अन्य ऑपरेटरों के साथ मिलकर बिट-संचालन को भी प्रभावित कर सकते हैं।
बिट प्रकलन, कुछ स्थितियों में, डेटा संरचना पर लूप की आवश्यकता को कम या कम कर सकता है और कई गुना गति दे सकता है, क्योंकि बिट प्रकलन को समानांतर में संसाधित किया जाता है।
शब्दावली
बिट ट्विडलिंग, बिट फिडलिंग और बिट बैशिंग का उपयोग अधिकांशतः बिट मैनीपुलेशन के साथ एक दूसरे के स्थान पर किया जाता है, किन्तु कभी-कभी विशेष रूप से चतुर या गैर-स्पष्ट तरीकों या बिट प्रकलन के उपयोग, या थकाऊ या चुनौतीपूर्ण उच्च और निम्न-स्तरीय डिवाइस नियंत्रण डेटा प्रकलन कार्यों को संदर्भित करता है।
बिट ट्विडलिंग शब्द प्रारंभिक कंप्यूटिंग हार्डवेयर से आया है, जहां कंप्यूटर ऑपरेटर कंप्यूटर नियंत्रणों में बदलाव या घुमा-फिरा कर समायोजन करते थे। इस प्रकार जैसे-जैसे कंप्यूटर प्रोग्रामिंग भाषाएं विकसित हुईं, प्रोग्रामर्स ने डेटा के किसी भी प्रबंधन के लिए इस शब्द को अपनाया जिसमें बिट-स्तरीय गणना सम्मिलित है।
बिटवाइज़ ऑपरेशन
एक बिटवाइज़ ऑपरेशन एक या एक से अधिक थोड़ा अभ्यास या बाइनरी अंक प्रणाली पर उनके व्यक्तिगत बिट्स के स्तर पर संचालित होता है। इस प्रकार यह केंद्रीय प्रसंस्करण इकाई (सीपीयू) द्वारा सीधे समर्थित एक तेज़, आदिम क्रिया है और इसका उपयोग तुलना और गणना के लिए मूल्यों में प्रकलन करने के लिए किया जाता है।
अधिकांश प्रोसेसरों पर, अधिकांश बिटवाइज़ ऑपरेशन एकल चक्र होते हैं - विभाजन और गुणन और शाखाओं की तुलना में अधिक तेज़ हैं। इस प्रकार जबकि आधुनिक प्रोसेसर सामान्यतः कुछ अंकगणितीय और तार्किक संचालन करते हैं, जितनी तेजी से उनके लंबे निर्देश पाइपलाइन और अन्य कंप्यूटर आर्किटेक्चर डिजाइन विकल्पों के कारण बिटवाइज़ संचालन होते हैं, संसाधनों के कम उपयोग के कारण बिटवाइज़ संचालन सामान्यतः कम बिजली का उपयोग करते हैं।
बिट प्रकलन का उदाहरण
यह निर्धारित करने के लिए कि क्या कोई संख्या दो की घात है, वैचारिक रूप से हम बार-बार पूर्णांक को दो से विभाजित कर सकते हैं जब तक कि संख्या 2 से समान रूप से विभाजित नहीं होगी; यदि एकमात्र कारक बचा है तो 1 है, मूल संख्या 2 की घात थी। इस प्रकार बिट और तार्किक ऑपरेटरों का उपयोग करके, एक सरल अभिव्यक्ति है जो सही (1) या गलत (0) लौटाएगा:
bool isPowerOfTwo = (x != 0) && ((x & (x - 1)) == 0);
दूसरी छमाही इस तथ्य का उपयोग करती है कि दो की शक्तियों में उनके बाइनरी प्रतिनिधित्व में एक और केवल एक बिट सेट होता है:
x == 0...010...0
एक्स-1 == 0...001...1
एक्स और (एक्स-1) == 0...000...0
इस प्रकार यदि संख्या न तो शून्य है और न ही दो की शक्ति है, तो इसमें एक से अधिक स्थानों पर '1' होगा:
x == 0...1...010...0 x-1 == 0...1...001...1 x & (x-1) == 0...1...000...0
यदि इनलाइन असेंबली भाषा कोड का उपयोग किया जाता है, तो एक निर्देश (पॉपकंट) जो ऑपरेंड में 1 या 0 की संख्या की गणना करता है, उपलब्ध हो सकता है; ठीक एक '1' बिट वाला ऑपरेंड 2 की शक्ति है। चूंकि, इस तरह के निर्देश में उपरोक्त बिटवाइज़ विधि की तुलना में अधिक विलंबता हो सकती है।
बिट प्रकलन संचालन
प्रोसेसर सामान्यतः उपयोगी बिट ऑपरेटरों का केवल एक सबसेट प्रदान करते हैं। प्रोग्रामिंग लैंग्वेज अधिकांश बिट ऑपरेशंस को सीधे समर्थन नहीं करती हैं, इसलिए उन्हें कोड करने के लिए मुहावरों का उपयोग किया जाना चाहिए। उदाहरण के लिए, 'सी' प्रोग्रामिंग भाषा केवल बिट-वार AND(&), OR(|), XOR(^) और NOT(~) प्रदान करती है। फोरट्रान AND(.and.), OR (.or.), XOR (.neqv.) और EQV(.eqv.) प्रदान करता है। इस प्रकार अल्गोल सिंटैक्टिक बिटफ़ील्ड एक्सट्रैक्ट और इंसर्ट प्रदान करता है। इस प्रकार जब भाषाएं बिट ऑपरेशंस प्रदान करती हैं जो सीधे हार्डवेयर निर्देशों को मैप नहीं करती हैं, तो कंपाइलर्स को उपलब्ध ऑपरेटरों से ऑपरेशन को संश्लेषित करना चाहिए।
एक विशेष रूप से उपयोगी बिट ऑपरेशन एक मशीन शब्द के उच्च सेट बिट को खोजने के लिए उपयोग किए जाने वाले अग्रणी शून्यों की गिनती है, चूंकि विभिन्न आर्किटेक्चर पर इसके अलग-अलग नाम हो सकते हैं।[1] कोई सरल प्रोग्रामिंग भाषा मुहावरा नहीं है, इसलिए इसे एक कंपाइलर इंट्रिंसिक या सिस्टम लाइब्रेरी रूटीन द्वारा प्रदान किया जाना चाहिए। इस प्रकार उस ऑपरेटर के बिना, अंकगणितीय संचालन के असममित कैरी-प्रचार के कारण, किसी शब्द के उच्च बिट के संबंध में कोई भी ऑपरेशन करने के लिए यह बहुत महंगा है (पहला सेट # सीएलजेड देखें)। सौभाग्य से, अधिकांश सीपीयू आर्किटेक्चर ने 1980 के दशक के मध्य से प्रदान किया है। साथ में ऑपरेशन काउंट वाले, जिसे पॉपकाउंट भी कहा जाता है, जो मशीन शब्द में सेट बिट्स की संख्या की गणना करता है, सामान्यतः हार्डवेयर ऑपरेटर के रूप में भी प्रदान किया जाता है। इस प्रकार बिट सेट, रीसेट, टेस्ट और टॉगल जैसे सरल बिट ऑपरेशंस अधिकांशतः हार्डवेयर ऑपरेटरों के रूप में प्रदान किए जाते हैं, किन्तु यदि वे नहीं हैं तो आसानी से अनुकरण किए जाते हैं - उदाहरण के लिए (सेट R0, 1; एलएसएचएफटी आर0, आई; या एक्स, आर0) सेट बिट i ऑपरेंड एक्स में।
इस प्रकार कुछ अधिक उपयोगी और जटिल बिट ऑपरेशंस जिन्हें प्रोग्रामिंग भाषा में मुहावरों के रूप में कोडित किया जाना चाहिए और कंपाइलर्स द्वारा संश्लेषित में सम्मिलित हैं:
- निर्दिष्ट बिट स्थिति से स्पष्ट ऊपर (शब्द के निचले हिस्से को छोड़ दें)
- निर्दिष्ट बिट स्थिति से स्पष्ट नीचे (शब्द के ऊपरी भाग को छोड़ दें)
- कम बिट नीचे से मुखौटा (स्पष्ट निचला शब्द)
- हाई बिट अप से मास्क (स्पष्ट निचला शब्द)
- बिटफील्ड एक्सट्रैक्ट
- बिटफील्ड डालें
- बिटफ़ील्ड स्कैटर/एकत्र संचालन जो मशीन शब्द पर बिटफ़ील्ड के सन्निहित भागों को वितरित करते हैं, या शब्द में अलग-अलग बिटफ़ील्ड को बिटफ़ील्ड के एक सन्निहित हिस्से में समूहित करते हैं (हाल ही के इंटेल पीईएक्सटी/पीडीईपी ऑपरेटरों को देखें)। क्रिप्टोग्राफी और वीडियो एन्कोडिंग द्वारा उपयोग किया जाता है।
- मैट्रिक्स उलटा
कुछ अंकगणितीय संक्रियाओं को सरल संक्रियाओं और बिट संक्रियाओं में घटाया जा सकता है:
- शिफ्ट-ऐड के अनुक्रम के लिए स्थिरांक से गुणा कम करें
उदाहरण के लिए 9 से गुणा करें, कॉपी ऑपरेंड है, 3 से शिफ्ट करें (8 से गुणा करें), और मूल ऑपरेंड में जोड़ें।
- शिफ्ट-घटाने के क्रम में निरंतर विभाजन को कम करें।
मास्किंग
एक मुखौटा वह डेटा है जिसका उपयोग बिटवाइज़ संचालन के लिए किया जाता है, विशेष रूप से बिट फ़ील्ड में किया जाता है।
मास्क का उपयोग करके, एक बाइट, निबल, वर्ड (कंप्यूटर आर्किटेक्चर) (आदि) में कई बिट्स को एक ही बिटवाइज़ ऑपरेशन में चालू, बंद या उलटा (या इसके विपरीत) सेट किया जा सकता है। इस प्रकार मास्किंग के अधिक व्यापक अनुप्रयोग, जब संचालन के लिए सशर्त रूप से लागू होते हैं, तो उन्हें प्रिडिक्शन (कंप्यूटर आर्किटेक्चर) कहा जाता है।
यह भी देखें
- बिट सरणी
- थोड़ा पीटना
- बिट फील्ड
- बिट प्रकलन निर्देश सेट - x86 निर्देश सेट के लिए बिट प्रकलन एक्सटेंशन।
- बिट विधेय
- बिट विशिष्टता (बहुविकल्पी)
- बिट ट्विडलर (बहुविकल्पी)
- निबल - डेटा की इकाई जिसमें 4 बिट या आधा बाइट होता है
- भविष्यवाणी (कंप्यूटर आर्किटेक्चर) जहां वेक्टर प्रोसेसर में बिट मास्क का उपयोग किया जाता है
- एकल-घटना परेशान
संदर्भ
- ↑ On most Intel chips, it's BSR (bitscan reverse), though newer SoCs also have LZCNT (count leading zeros)
अग्रिम पठन
- Warren, Henry S. (2013). Hacker's Delight (2nd ed.). Addison–Wesley Professional. p. 512. ISBN 978-0321842688.
- Knuth, Donald E. (2009). The Art of Computer Programming Volume 4, Fascicle 1: Bitwise tricks & techniques; Binary Decision Diagrams (1st ed.). Addison–Wesley Professional. p. 272. ISBN 978-0321580504. (Draft of Fascicle 1a available for download)
बाहरी संबंध
- Anderson, Sean Eron, ed. (2009-11-26) [1997]. "Bit Twiddling Hacks". Stanford University. Archived from the original on 2020-06-01. Retrieved 2020-06-01.
- Bit Manipulation Tricks with full explanations and source code
- Intel Intrinsics Guide
- xchg rax, rax: x86_64 riddles and hacks
- The Aggregate Magic Algorithms from University of Kentucky