बिट प्रकलन

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

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

इस प्रकार पूर्णांक अंकगणितीय ऑपरेटर अन्य ऑपरेटरों के साथ मिलकर बिट-संचालन को भी प्रभावित कर सकते हैं।

बिट प्रकलन, कुछ स्थितियों में, डेटा संरचना पर लूप की आवश्यकता को कम या कम कर सकता है और कई गुना गति दे सकता है, क्योंकि बिट प्रकलन को समानांतर में संसाधित किया जाता है।

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

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

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

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

बिट प्रकलन का उदाहरण
यह निर्धारित करने के लिए कि क्या कोई संख्या दो की घात है, वैचारिक रूप से हम बार-बार पूर्णांक को दो से विभाजित कर सकते हैं जब तक कि संख्या 2 से समान रूप से विभाजित नहीं होगी; यदि एकमात्र कारक बचा है तो 1 है, मूल संख्या 2 की घात थी। इस प्रकार बिट और तार्किक ऑपरेटरों का उपयोग करके, एक सरल अभिव्यक्ति है जो सही (1) या गलत (0) लौटाएगा:

दूसरी छमाही इस तथ्य का उपयोग करती है कि दो की शक्तियों में उनके बाइनरी प्रतिनिधित्व में एक और केवल एक बिट सेट होता है: x == 0...0 1 0...0 एक्स-1 == 0...001...1 एक्स और (एक्स-1) == 0...000...0

इस प्रकार यदि संख्या न तो शून्य है और न ही दो की शक्ति है, तो इसमें एक से अधिक स्थानों पर '1' होगा: x == 0... 1 ...0 1 0...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.) प्रदान करता है। इस प्रकार अल्गोल सिंटैक्टिक बिटफ़ील्ड एक्सट्रैक्ट और इंसर्ट प्रदान करता है। इस प्रकार जब भाषाएं बिट ऑपरेशंस प्रदान करती हैं जो सीधे हार्डवेयर निर्देशों को मैप नहीं करती हैं, तो कंपाइलर्स को उपलब्ध ऑपरेटरों से ऑपरेशन को संश्लेषित करना चाहिए।

एक विशेष रूप से उपयोगी बिट ऑपरेशन एक मशीन शब्द के उच्च सेट बिट को खोजने के लिए उपयोग किए जाने वाले अग्रणी शून्यों की गिनती है, चूंकि विभिन्न आर्किटेक्चर पर इसके अलग-अलग नाम हो सकते हैं। कोई सरल प्रोग्रामिंग भाषा मुहावरा नहीं है, इसलिए इसे एक कंपाइलर इंट्रिंसिक या सिस्टम लाइब्रेरी रूटीन द्वारा प्रदान किया जाना चाहिए। इस प्रकार उस ऑपरेटर के बिना, अंकगणितीय संचालन के असममित कैरी-प्रचार के कारण, किसी शब्द के उच्च बिट के संबंध में कोई भी ऑपरेशन करने के लिए यह बहुत महंगा है (पहला सेट # सीएलजेड देखें)। सौभाग्य से, अधिकांश सीपीयू आर्किटेक्चर ने 1980 के दशक के मध्य से प्रदान किया है। साथ में ऑपरेशन काउंट वाले, जिसे पॉपकाउंट भी कहा जाता है, जो मशीन शब्द में सेट बिट्स की संख्या की गणना करता है, सामान्यतः हार्डवेयर ऑपरेटर के रूप में भी प्रदान किया जाता है। इस प्रकार बिट सेट, रीसेट, टेस्ट और टॉगल जैसे सरल बिट ऑपरेशंस अधिकांशतः हार्डवेयर ऑपरेटरों के रूप में प्रदान किए जाते हैं, किन्तु यदि वे नहीं हैं तो आसानी से अनुकरण किए जाते हैं - उदाहरण के लिए (सेट R0, 1; एलएसएचएफटी आर0, आई; या एक्स, आर0) सेट बिट i ऑपरेंड एक्स में।

इस प्रकार कुछ अधिक उपयोगी और जटिल बिट ऑपरेशंस जिन्हें प्रोग्रामिंग भाषा में मुहावरों के रूप में कोडित किया जाना चाहिए और कंपाइलर्स द्वारा संश्लेषित में सम्मिलित हैं:

कुछ अंकगणितीय संक्रियाओं को सरल संक्रियाओं और बिट संक्रियाओं में घटाया जा सकता है: उदाहरण के लिए 9 से गुणा करें, कॉपी ऑपरेंड है, 3 से शिफ्ट करें (8 से गुणा करें), और मूल ऑपरेंड में जोड़ें।
 * निर्दिष्ट बिट स्थिति से स्पष्ट ऊपर (शब्द के निचले हिस्से को छोड़ दें)
 * निर्दिष्ट बिट स्थिति से स्पष्ट नीचे (शब्द के ऊपरी भाग को छोड़ दें)
 * कम बिट नीचे से मुखौटा (स्पष्ट निचला शब्द)
 * हाई बिट अप से मास्क (स्पष्ट निचला शब्द)
 * बिटफील्ड एक्सट्रैक्ट
 * बिटफील्ड डालें
 * बिटफ़ील्ड स्कैटर/एकत्र संचालन जो मशीन शब्द पर बिटफ़ील्ड के सन्निहित भागों को वितरित करते हैं, या शब्द में अलग-अलग बिटफ़ील्ड को बिटफ़ील्ड के एक सन्निहित हिस्से में समूहित करते हैं (हाल ही के इंटेल पीईएक्सटी/पीडीईपी ऑपरेटरों को देखें)। क्रिप्टोग्राफी और वीडियो एन्कोडिंग द्वारा उपयोग किया जाता है।
 * मैट्रिक्स उलटा
 * शिफ्ट-ऐड के अनुक्रम के लिए स्थिरांक से गुणा कम करें
 * शिफ्ट-घटाने के क्रम में निरंतर विभाजन को कम करें।

मास्किंग
एक मुखौटा वह डेटा है जिसका उपयोग बिटवाइज़ संचालन के लिए किया जाता है, विशेष रूप से बिट फ़ील्ड में किया जाता है।

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

यह भी देखें

 * बिट सरणी
 * थोड़ा पीटना
 * बिट फील्ड
 * बिट प्रकलन निर्देश सेट - x86 निर्देश सेट के लिए बिट प्रकलन एक्सटेंशन।
 * बिट विधेय
 * बिट विशिष्टता (बहुविकल्पी)
 * बिट ट्विडलर (बहुविकल्पी)
 * निबल - डेटा की इकाई जिसमें 4 बिट या आधा बाइट होता है
 * भविष्यवाणी (कंप्यूटर आर्किटेक्चर) जहां वेक्टर प्रोसेसर में बिट मास्क का उपयोग किया जाता है
 * एकल-घटना परेशान

अग्रिम पठन

 * (Draft of Fascicle 1a available for download)
 * (Draft of Fascicle 1a available for download)

बाहरी संबंध

 * 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
 * The Aggregate Magic Algorithms from University of Kentucky