वांछित बिट सी के लिए एक संख्या लिखें। बिट संचालन। __________बिटवाइज XOR _______________

व्यवस्थापक 09.02.2015

शुभ दिन प्रिय मित्रों!
साइट पर आपका स्वागत है

बिट संचालन

बूलियन बिटवाइज़ (बिटवाइज़) ऑपरेशन
बिट शिफ्ट ऑपरेशन

पिछले लेख में इस विषय पर चर्चा की गई थी। इस लेख में, हम देखेंगे तार्किक बिट संचालन . बिट संचालन तार्किक संचालन के बहुत करीब हैं, आप यह भी कह सकते हैं कि वे एक ही हैं। अंतर केवल इतना है कि तार्किक संचालन कथनों पर लागू होते हैं, जबकि बिट संचालन, समान नियमों और परिणामों के साथ, बिट्स पर लागू होते हैं।

वेरिएबल्स केवल नाम हैं जिनका उपयोग स्मृति में किसी स्थान को संदर्भित करने के लिए किया जाता है - वह स्थान जहां हम जिस मूल्य के साथ काम कर रहे हैं वह संग्रहीत है। यह एक मूल्य के लिए प्लेसहोल्डर के रूप में चर के बारे में सोचने में मदद कर सकता है। आप एक चर को उसके नियत मान के बराबर मान सकते हैं।

यह चर घोषित करके किया जाता है। अर्थात्, प्रत्येक घोषित चर को एक विशेष चर प्रकार के रूप में निर्दिष्ट किया जाना चाहिए। कृपया ध्यान दें कि हमें उस प्रकार के डेटा को निर्दिष्ट करना होगा जिसे वेरिएबल स्टोर करेगा। इसके लिए कुछ खोजशब्द हैं - हम उन्हें अगले भाग में देखेंगे। एक कथन के साथ कई चर घोषित किए जा सकते हैं, उदा।



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

हम एक ही समय में एक चर के लिए कुछ सामग्री घोषित और असाइन भी कर सकते हैं। इसे इनिशियलाइज़ेशन कहा जाता है। चर घोषित करने के बाद, आप बाद में इस तरह के एक बयान का उपयोग करके चर के लिए एक मान निर्दिष्ट कर सकते हैं। आप किसी अन्य वेरिएबल का मान किसी वेरिएबल को भी निर्दिष्ट कर सकते हैं, उदा।

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

सामान्य प्रोग्रामिंग भाषाओं में, केवल चार बिटवाइज़ (बिटवाइज़) लॉजिकल ऑपरेशंस: और, या, नोटतथा एकमात्र।एक मनमाना बिटवाइज़ लॉजिकल ऑपरेशन निर्दिष्ट करने के लिए, सूचीबद्ध ऑपरेशन काफी पर्याप्त हैं।

अभिव्यक्ति "बिट ऑपरेशन" और "बिट ऑपरेशन" के साथ भ्रम से बचने के लिए, याद रखें कि बिट ऑपरेशन करना अलग-अलग बिट्स पर बिटवाइज़ ऑपरेशन कर रहा है, और भविष्य में मैं बस लिखूंगा - "बिट ऑपरेशन" या "लॉजिकल ऑपरेशन"।

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

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

इसके अलावा, जब आप तकनीकी साहित्य पढ़ते हैं, तो आप शायद शब्दों के पार आ जाएंगे "यूनरी ऑपरेशन" और "बाइनरी ऑपरेशन".
यूनरी ऑपरेशन- एक ऑपरेंड पर ऑपरेशन (बिट ऑपरेशन "नहीं")।
बाइनरी ऑपरेशन- दो ऑपरेंड के साथ ऑपरेशन (बिट ऑपरेशन "AND", "OR", "EXCLUSIVE OR")

इसके अलावा, रजिस्टर करें सामान्य उद्देश्य(R0 ... R31) मैं RON को संक्षिप्त कर दूंगा।

कुछ लोग सोचते हैं कि यदि हम इसका उपयोग किसी वर्ण को संग्रहीत करने के लिए करते हैं, न कि छोटी संख्या के लिए, तो यह एक बहुत बुरा अभ्यास है, क्योंकि यदि कोई आपका कोड पढ़ता है, तो अधिकांश पाठक यह देखने के लिए मजबूर होते हैं कि कौन सा वर्ण एन्कोडिंग में संख्या 97 से मेल खाता है। यह ध्यान रखना महत्वपूर्ण है कि अंकों के प्रतीकों को उनकी संगत संख्या से भिन्न रूप से दर्शाया जाता है, अर्थात। 1 बराबर नहीं है संक्षेप में, "एकल उद्धरण" में संलग्न कोई एकल प्रविष्टि।

एक अन्य प्रकार का शाब्दिक है जिसे वर्णों के संबंध में समझाने की आवश्यकता है: स्ट्रिंग शाब्दिक। एक स्ट्रिंग वर्णों का एक क्रम है, जिसे आमतौर पर प्रदर्शित करने का इरादा होता है। वे दोहरे उद्धरण चिह्नों से घिरे हैं। एक स्ट्रिंग शाब्दिक वर्णों की एक सरणी को सौंपा गया है, सरणियों का वर्णन नीचे किया गया है।

बिटवाइज़ (बिटवाइज़) बूलियन ऑपरेशंस

यदि बिट "1" है, तो ऑपरेशन करने के बाद, यह "0" के बराबर होगा। इसके विपरीत, यदि बिट "0" है, तो ऑपरेशन करने के बाद, यह "1" के बराबर होगा। (ऑपरेशन सभी RON बिट्स पर एक साथ किया जाता है)। ऑपरेंड के रूप में केवल RON का उपयोग किया जा सकता है

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

आप किसी भी डेटा प्रकार के डेटा स्टोर को कुछ संशोधक के साथ उपसर्ग करके बदल सकते हैं। ऐसा सबसे अधिक बार होता है। लंबाई का उपयोग मूल्यों की एक विस्तृत श्रृंखला को संग्रहीत करने के लिए किया जा सकता है। ऊपर वर्णित सभी प्रकारों में, मूल्य के संकेत को इंगित करने के लिए एक बिट का उपयोग किया जाता है। यदि आप तय करते हैं कि एक चर कभी नहीं होगा नकारात्मक अर्थ, आप अन्य डेटा को संग्रहीत करने के लिए उस एक बिट का उपयोग करने के लिए एक अहस्ताक्षरित संशोधक का उपयोग कर सकते हैं, प्रभावी रूप से मूल्यों की सीमा को दोगुना कर सकते हैं, यह दर्शाता है कि वे मान सकारात्मक होंगे।

चिन्ह द्वारा निरूपित «~»

रजिस्टर बिट्स की स्थिति को उलटने के अलावा, बिट ऑपरेशन नहीं,किसी संख्या का अतिरिक्त कोड खोजने के लिए उपयोग किया जाता है (एक सकारात्मक संख्या से - एक नकारात्मक बनाएं)। ऐसा करने के लिए, आपको संख्या को उल्टा करना होगा और परिणाम में एक जोड़ना होगा।.

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

बिटवाइज़ और, या, नहीं, XOR

उदाहरण के लिए, आप किराना स्टोर के लिए प्रोग्राम लिख सकते हैं। इस जटिल कार्यक्रम में कोड की हजारों और हजारों लाइनें हैं। प्रोग्रामर मकई के एक कैन के मूल्य का प्रतिनिधित्व करने का निर्णय लेता है, वर्तमान में 99 सेंट, एक शाब्दिक कोड के रूप में। अब मान लीजिए कि मकई की एक कैन का मूल्य 89 सेंट में बदल जाता है। प्रोग्रामर को अब अंदर जाना होगा और प्रत्येक 99 प्रतिशत प्रविष्टि को मैन्युअल रूप से बदलना होगा। हालांकि यह कोई बड़ी बात नहीं है, कई पाठ संपादकों की "वैश्विक खोज-और-प्रतिस्थापन" सुविधा को देखते हुए, एक अन्य मुद्दे पर विचार करें: हरी बीन्स की एक कैन की भी शुरुआत में 99 सेंट की लागत होती है।

अतिरिक्त कोड, साथ ही फॉरवर्ड और रिवर्स कोड, प्रतिनिधित्व करने के सबसे सामान्य तरीके हैं दशमलव संख्याएंमें बाइनरी कोड. इस मुद्दे पर एक अलग लेख में चर्चा की जाएगी।

यदि ऑपरेंड के दोनों संगत बिट 1 हैं, तो परिणामी बिट 1 है; यदि जोड़ी से कम से कम एक बिट 0 है, तो परिणामी बाइनरी अंक 0 है। दो RON या RON और एक स्थिरांक (MK मेमोरी में संग्रहीत एक संख्या) को ऑपरेंड के रूप में उपयोग किया जा सकता है

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

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

चिन्ह द्वारा निरूपित «&»

प्रायोगिक उपयोग:
- एक विशिष्ट बिट को शून्य पर रीसेट करने के लिए:


- 0 या 1 के लिए बिट की जाँच करना एक विशिष्ट बिट का पठन भी है (यदि परिणाम 0 है, तो बिट 0 है, अन्यथा बिट 1 है):

यदि चर वैश्विक है, तो इसे आपके प्रोग्राम में कहीं से भी पढ़ा और लिखा जा सकता है। वैश्विक चर को अच्छा प्रोग्रामिंग अभ्यास नहीं माना जाता है और जब भी संभव हो इससे बचा जाना चाहिए। वे कोड को पढ़ने से रोकते हैं, नामकरण विरोध पैदा करते हैं, स्मृति बर्बाद करते हैं, और बग ट्रैकिंग के लिए बग उत्पन्न कर सकते हैं। ग्लोबल्स का अत्यधिक उपयोग आमतौर पर आलस्य या खराब डिजाइन का संकेत है। हालांकि, अगर ऐसी स्थिति है जहां स्थानीय चर कमजोर और अधिक अपठनीय कोड बना सकते हैं, तो वैश्विक चर का उपयोग करने में कोई शर्म की बात नहीं है।


- किसी संख्या की समता की जाँच करना (समता - किसी संख्या को दो से विभाजित करने की क्षमता)
सम संख्याओं के लिए, पहला बिट (सबसे दाहिना वाला) हमेशा शून्य होता है, और विषम संख्याओं के लिए, एक:

एक आम अविश्वास यह है कि एकमात्र उद्देश्य एक चर को स्मृति में संग्रहीत करना है। जब आप किसी फ़ंक्शन या वैश्विक चर को स्थिर घोषित करते हैं, तो यह आंतरिक हो जाता है। जब आप स्थानीय चर को स्थिर घोषित करते हैं, तो यह किसी अन्य चर की तरह ही बनाया जाता है। हालाँकि, जब कोई चर दायरे से बाहर हो जाता है, तो चर अपना मान रखते हुए स्मृति में रहता है। प्रोग्राम के अंत तक वेरिएबल मेमोरी में रहता है। हालांकि यह व्यवहार वैश्विक चर के समान है, स्थिर चर अभी भी दायरे के नियमों के अधीन हैं और इसलिए उनके दायरे से बाहर नहीं पहुंचा जा सकता है।

यदि दोनों संगत ऑपरेंड बिट्स 0 हैं, तो परिणाम बिट 0 है; यदि जोड़ी का कम से कम एक बिट 1 है, तो परिणाम का द्विआधारी अंक 1 है। दो आरओएन या आरओएन और एक स्थिरांक को ऑपरेंड के रूप में इस्तेमाल किया जा सकता है

चिन्ह द्वारा निरूपित «|» (ऊर्ध्वाधर छड़ी)

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

बिट शिफ्ट राइट

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

बिट ऑपरेशन EXCLUSIVE OR

प्रदर्शन कार्रवाई का परिणाम 1 है यदि जोड़ने के लिए 1-बिट्स की संख्या विषम है, और 0 यदि यह सम है। ऑपरेंड के रूप में केवल RON का उपयोग किया जा सकता है

चिन्ह द्वारा निरूपित «^»


दायरा - उस ब्लॉक के लिए स्थानीय जिसमें इसे घोषित किया गया है। जीवन काल। मान विभिन्न फ़ंक्शन कॉल के बीच संरक्षित है। कीवर्ड प्रकार। कीवर्ड का उपयोग करना सुनिश्चित करें। दायरा - वैश्विक जीवनकाल - मान कार्यक्रम के निष्पादन के अंत तक बना रहता है। कीवर्ड प्रकार वैकल्पिक है यदि सभी कार्यों के बाहर घोषित किया गया है।

यदि आपको लगता है कि यह वैसा ही है जैसा आप एक चर घोषित करते समय करते रहे हैं, तो आप सही हैं: एक ब्लॉक के अंदर सभी घोषित तत्व निहित रूप से "स्वचालित" हैं। स्वचालित चर की विशेषताएं। डिफ़ॉल्ट मान कचरा मान है। दायरा - उस ब्लॉक के लिए स्थानीय जिसमें इसे परिभाषित किया गया है। जब तक नियंत्रण ब्लॉक में रहता है तब तक मान को बरकरार रखा जाता है। कीवर्ड वैकल्पिकता।

प्रायोगिक उपयोग:
- मास्क द्वारा रजिस्टर बिट्स को पलटना

- रजिस्टर समानता की परिभाषा (यदि परिणाम शून्य है, तो रजिस्टरों की सामग्री समान है, अन्यथा यह समान नहीं है):

बिटवाइज शिफ्ट ऑपरेशंस

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

बिट शिफ्ट ऑपरेशन

कमांड सिस्टम में एवीआर माइक्रोकंट्रोलरऐसे कई बिटवाइज़ ऑपरेशन हैं जिन्हें केवल एक सेक्शन में स्पष्ट रूप से विशेषता देना मुश्किल है तार्किक संचालन, वे अंकगणितीय संक्रियाओं के खंड में अपने लिए एक जगह ढूंढ सकते हैं (या बल्कि, वे वहां हैं)। ऐसे तीन ऑपरेशन हैं:
- तार्किक बदलाव
- अंकगणितीय पारी
- कैरी बिट के माध्यम से चक्रीय बदलाव
हम केवल से संबंधित कार्यों पर विचार करेंगे तार्किक बदलाव, और संचालन अंकगणित और चक्रीय बदलाव- माइक्रोकंट्रोलर कमांड पर लेखों में।
बिट शिफ्ट ऑपरेशनतार्किक बदलाव से संबंधित:
- बाईं ओर तार्किक बदलाव
- दाईं ओर तार्किक बदलाव

बिट मैनिपुलेशन विभिन्न बिटवाइज़ ऑपरेशंस का उपयोग करता है। ये बिट ऑपरेशन बिट पैटर्न के अलग-अलग बिट्स पर काम करते हैं। बिट ऑपरेशन तेज हैं और समय की जटिलता को अनुकूलित करने के लिए इसका उपयोग किया जा सकता है। कुछ सामान्य बिट ऑपरेटर।

__________ बिटवाइज़ उलटा ~ _______________

यदि बिट पैटर्न स्थिति में दोनों बिट्स की तुलना की जा रही है, तो परिणामी बिट पैटर्न में बिट 1 है, अन्यथा। बिटवाइज़ ऑपरेटर स्थान बचाने के लिए और कभी-कभी निर्भरता को स्मार्ट तरीके से हटाने के लिए अच्छे होते हैं। टिप्पणी। इस लेख में लिए गए सभी बाएँ और दाएँ पक्ष पाठक के संदर्भ में लिए गए हैं।

बाईं ओर एक तार्किक बदलाव के साथ, रजिस्टर के सभी बिट्स को एक स्थान से बाईं ओर स्थानांतरित कर दिया जाता है, सबसे महत्वपूर्ण बिट (सबसे बाईं ओर) खो जाता है, और 0 को कम से कम महत्वपूर्ण (दाएं) पर लिखा जाता है।

चिन्ह द्वारा निरूपित «<<«



मुख्य रूप से के रूप में उपयोग किया जाता है अंकगणितीय संक्रिया 2 से पूर्णांक गुणन के लिए।
ऊपर दिया गया आंकड़ा दो बार किए गए "लॉजिकल शिफ्ट लेफ्ट" ऑपरेशन को दिखाता है - बाइट की सामग्री के बाईं ओर दो शिफ्ट किए गए थे।
जिसमें:
- उच्च बिट्स, (लाल रंग में हाइलाइट किया गया) गुमनामी में चले जाते हैं (खो जाते हैं)
- निचले बिट्स के खाली स्थान "0" (नीले रंग में हाइलाइट किए गए) से भरे हुए हैं

बिटवाइज़ बूलियन ऑपरेशंस क्यों आवश्यक हैं

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

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

देखते है क्या हुआ:
- रजिस्टर का प्रारंभिक मूल्य 0000 0101 = 5 (दशमलव प्रणाली में)
- बाईं ओर पहली शिफ्ट - हमें 0000 1010 = 10 . मिलता है
- बाईं ओर दूसरी पाली - हमें मिलता है 0001 0100 = 20
- और अगर हम तीसरी पाली करते हैं - हमें 0010 1000 = 40 . मिलता है
जैसा कि आप देख सकते हैं, प्रत्येक रजिस्टर शिफ्ट का परिणाम दो से गुणा होता है। इस प्रकार, यदि हमें रजिस्टर की सामग्री को 8 (2 से 3 के घात) से गुणा करने की आवश्यकता है, तो हमें बाईं ओर 3 बदलाव करने होंगे। और अगर आपको 16 (2 से 4 की शक्ति) से गुणा करने की आवश्यकता है, तो 4 शिफ्ट।
इस मामले में, यह ध्यान में रखा जाना चाहिए कि जिस संख्या से रजिस्टर की सामग्री को गुणा किया जा सकता है वह "2 से n की शक्ति" के बराबर होना चाहिए।

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

दाईं ओर एक तार्किक बदलाव के साथ, रजिस्टर के सभी बिट्स को एक स्थान से दाईं ओर स्थानांतरित कर दिया जाता है, कम से कम महत्वपूर्ण बिट (सबसे दाहिना वाला) खो जाता है, और 0 को सबसे महत्वपूर्ण (सबसे बाईं ओर) लिखा जाता है।

चिन्ह द्वारा निरूपित «>>»


पूर्णांक विभाजन के लिए 2 से अंकगणितीय ऑपरेशन के रूप में उपयोग किया जाता है।

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

रजिस्टर में लिखी गई प्रारंभिक संख्या 00100101 = 37 (दशमलव) है
- पहली पाली - हमें मिलता है 0001 0010 = 18
- दूसरी पाली - हमें 0000 1001 = 9 . मिलता है
दाईं ओर एक तार्किक बदलाव के साथ, पूर्णांक संख्या को 2 से विभाजित किया जाता है। उसी समय, जैसा कि आप देख सकते हैं, यदि संख्या विषम (37) है, तो जब 2 से विभाजित किया जाता है, तो यह, जैसा था, गोल हो गया है। (18)। इस मामले में, यह ध्यान में रखा जाना चाहिए कि जिस संख्या से रजिस्टर की सामग्री को विभाजित किया जा सकता है वह "2 से n की शक्ति" के बराबर होना चाहिए।

पिछले लेख:

2. संख्या प्रणाली: दशमलव, बाइनरी और हेक्साडेसिमल

इस लेख में, मैं आपको बताऊंगा कि बिट ऑपरेशन कैसे काम करते हैं। पहली नज़र में, वे आपको कुछ जटिल और बेकार लग सकते हैं, लेकिन वास्तव में ऐसा बिल्कुल नहीं है। यही मैं आपको समझाने की कोशिश करूंगा।

परिचय

बिटवाइज़ ऑपरेटर किसी संख्या के बिट्स पर सीधे संचालन करते हैं, इसलिए उदाहरणों में संख्याएँ होंगी बायनरी सिस्टमगणना

मैं निम्नलिखित बिटवाइज़ ऑपरेटरों को कवर करूंगा:

  • | (बिटवाइज OR (OR)),
  • और (बिटवाइज और (AND)),
  • ^ (अनन्य या (एक्सओआर)),
  • ~ (बिटवाइज निषेध (नहीं)),
  • << (Побитовый сдвиг влево),
  • >> (बिटवाइज राइट शिफ्ट)।

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

आपको बिटवाइज़ ऑपरेटरों के बारे में भी जानना होगा:

  1. कुछ बिटवाइज़ ऑपरेटर उन ऑपरेटरों के समान होते हैं जिनसे आप शायद परिचित हैं (&&, ||)। ऐसा इसलिए है क्योंकि वे वास्तव में कुछ हद तक समान हैं। हालांकि, उन्हें कभी भ्रमित नहीं होना चाहिए।
  2. अधिकांश बिटवाइज़ ऑपरेशंस कंपाउंड असाइनमेंट ऑपरेशंस हैं।

बिटवाइज या (या)

बिटवाइज़ OR लॉजिकल OR के बराबर है, लेकिन बाइनरी नंबर के बिट्स के प्रत्येक जोड़े पर लागू होता है। परिणाम का बाइनरी अंक 0 तभी होता है जब B में दोनों संगत बिट्स 0 होते हैं। अन्य सभी मामलों में, बाइनरी परिणाम 1 होता है। अर्थात, यदि हमारे पास निम्नलिखित सत्य तालिका है:

38 | 53 इस तरह होगा:

0 0 1 0 0 1 1 0
बी0 0 1 1 0 1 0 1
ए | बी0 0 1 1 0 1 1 1

परिणामस्वरूप, हमें मिलता है 110111 2 , या 55 10 ।

बिटवाइज़ और (और)

बिटवाइज़ AND, बिटवाइज़ OR के बिल्कुल विपरीत है। परिणाम का बाइनरी अंक केवल 1 होता है जब ऑपरेंड के दोनों संबंधित बिट्स 1 होते हैं। दूसरे शब्दों में, हम कह सकते हैं कि परिणामी संख्या के बाइनरी अंक ऑपरेंड के संबंधित बिट्स को गुणा करने का परिणाम हैं: 1x1 \u003d 1 , 1x0 \u003d 0. निम्न सत्य तालिका बिटवाइज़ से मेल खाती है और:

बिटवाइज़ के संचालन का एक उदाहरण और अभिव्यक्ति 38 और 53 पर:

0 0 1 0 0 1 1 0
बी0 0 1 1 0 1 0 1
ए और बी0 0 1 0 0 1 0 0

परिणामस्वरूप, हमें 100100 2 , या 36 10 मिलता है।

बिटवाइज़ और ऑपरेटर का उपयोग करके, आप जांच सकते हैं कि कोई संख्या सम है या विषम। पूर्णांकों के लिए, यदि कम से कम महत्वपूर्ण बिट 1 है, तो संख्या विषम है (रूपांतरण के आधार पर द्विआधारी संख्यादशमलव तक)। इसकी आवश्यकता क्यों है जब आप केवल% 2 का उपयोग कर सकते हैं? मेरे कंप्यूटर पर, उदाहरण के लिए, &1 66% तेज है। बहुत अच्छा प्रदर्शन बढ़ावा, मैं आपको बताता हूं।

एक्सक्लूसिव या (XOR)

XOR और bitwise OR के बीच का अंतर यह है कि 1 प्राप्त करने के लिए जोड़ी में केवल एक बिट 1 हो सकता है:

उदाहरण के लिए, व्यंजक 138^43 होगा...

1 0 0 0 1 0 1 0
बी0 0 1 0 1 0 1 1
ए ^ बी1 0 1 0 0 0 0 1

… 10100001 2 , या 160 10

^ के साथ आप अस्थायी चर का उपयोग किए बिना दो चर (समान डेटा प्रकार वाले) के मूल्यों को बदल सकते हैं।

आप XOR का उपयोग करके टेक्स्ट को एन्क्रिप्ट भी कर सकते हैं। ऐसा करने के लिए, आपको बस सभी वर्णों के माध्यम से पुनरावृति करने की आवश्यकता है, और ^ उन्हें मुख्य चरित्र के साथ। अधिक जटिल सिफर के लिए, आप एक वर्ण स्ट्रिंग का उपयोग कर सकते हैं:

स्ट्रिंग संदेश = "यह एक संदेश है";

चार संदेश = संदेश। toCharArray ();

स्ट्रिंग कुंजी = ".*)";

स्ट्रिंग एन्क्रिप्टेडस्ट्रिंग = नया स्ट्रिंग ();

के लिए (int i = 0; i < संदेश। लंबाई; i ++) (

एन्क्रिप्टेडस्ट्रिंग + = संदेश [i] ^ कुंजी। toCharArray() [i% कुंजी। लंबाई () ] ;

XOR एन्क्रिप्ट करने का सबसे सुरक्षित तरीका नहीं है, लेकिन इसे एन्क्रिप्शन एल्गोरिथम का हिस्सा बनाया जा सकता है।

बिटवाइज निषेध (नहीं)

बिटवाइज़ नेगेशन ऑपरेंड के सभी बिट्स को उलट देता है। यानी जो 1 था वह 0 हो जाएगा, और इसके विपरीत।

यहाँ, उदाहरण के लिए, ऑपरेशन ~52:

0 0 1 1 0 1 0 0
~ए1 1 0 0 1 0 1 1

परिणाम 203 10 . होगा

बिटवाइज़ नकार का उपयोग करते समय, परिणाम का चिह्न हमेशा मूल संख्या के चिह्न के विपरीत होगा (हस्ताक्षरित संख्याओं के साथ काम करते समय)। ऐसा क्यों हो रहा है, अभी पता चल जाएगा।

अतिरिक्त कोड

यहां मैं आपको थोड़ा बता दूं कि कंप्यूटर में ऋणात्मक पूर्णांकों को किस प्रकार प्रदर्शित किया जाता है, अर्थात् दोनों के पूरक। विवरण में जाने के बिना, बाइनरी संख्याओं के अंकगणित को सुविधाजनक बनाने की आवश्यकता है।

दो पूरक संख्याओं के बारे में आपको जो मुख्य बात जानने की आवश्यकता है वह यह है कि सबसे महत्वपूर्ण बिट पर हस्ताक्षर किए गए हैं। यदि यह 0 के बराबर है, तो संख्या सकारात्मक है और प्रत्यक्ष कोड में इस संख्या के प्रतिनिधित्व के साथ मेल खाती है, और यदि 1 है, तो यह नकारात्मक है। यानी 10111101 नेगेटिव और 01000011 पॉजिटिव है।

एक ऋणात्मक संख्या को दो के पूरक में बदलने के लिए, आपको संख्या के सभी बिट्स को उल्टा करना होगा (अर्थात, वास्तव में, बिटवाइज़ नकार का उपयोग करें) और परिणाम में 1 जोड़ें।

उदाहरण के लिए, यदि हमारे पास 109 है:

0 1 1 0 1 1 0 1
~ए 1 0 0 1 0 0 1 0
~ए+1 1 0 0 1 0 0 1 1

उपरोक्त विधि से हमें दो के पूरक में -109 प्राप्त होता है।
अतिरिक्त कोड की एक बहुत ही सरल व्याख्या अभी प्रस्तुत की गई है, और मैं आपको इस विषय का अधिक विस्तार से अध्ययन करने की दृढ़ता से सलाह देता हूं।

बिट शिफ्ट लेफ्ट

बिटवाइज़ शिफ्ट पहले चर्चा किए गए बिटवाइज़ ऑपरेशंस से थोड़ा अलग है। एक बिटवाइज़ लेफ्ट शिफ्ट अपने ऑपरेंड N बिट्स के बिट्स को बाईं ओर शिफ्ट करती है, जो कम से कम महत्वपूर्ण बिट से शुरू होती है। शिफ्ट के बाद खाली जगह को जीरो से भर दिया जाता है। ऐसा होता है:

1 0 1 1 0 1 0 0
ए<<2 1 1 0 1 0 0 0 0

N पदों द्वारा बायीं ओर खिसकने की एक दिलचस्प विशेषता यह है कि यह किसी संख्या को 2 N से गुणा करने के बराबर है। तो 43<<4 == 43*Math.pow(2,4) . Использование сдвига влево вместо Math.pow обеспечит неплохой прирост производительности.

बिट शिफ्ट राइट

जैसा कि आपने अनुमान लगाया होगा, >> ऑपरेंड के बिट्स को एक निर्दिष्ट संख्या में बिट्स को दाईं ओर शिफ्ट करता है।

यदि ऑपरेंड धनात्मक है, तो रिक्त स्थान शून्य से भर जाते हैं। यदि प्रारंभ में हम ऋणात्मक संख्या के साथ कार्य करते हैं, तो बाईं ओर के सभी रिक्त स्थान संख्याओं से भर जाते हैं। यह पहले बताए गए अतिरिक्त कोड के अनुसार चिन्ह को संरक्षित करने के लिए किया जाता है।

चूँकि बिटवाइज़ राइट शिफ्ट बिटवाइज़ लेफ्ट शिफ्ट के विपरीत है, इसलिए यह अनुमान लगाना आसान है कि किसी संख्या को N नंबर की पोजीशन से राइट शिफ्ट करने से भी वह नंबर 2 N से विभाजित हो जाता है। फिर, यह सामान्य विभाजन की तुलना में बहुत तेज है।

निष्कर्ष

तो, अब आप बिट संचालन के बारे में अधिक जानते हैं और उनसे डरो मत। मेरा अनुमान है कि आप हर बार 2 से विभाजित करने पर >>1 का उपयोग नहीं करेंगे। हालांकि, आपके शस्त्रागार में बिटवाइज़ संचालन करना अच्छा है, और अब आप आवश्यकता पड़ने पर उनका उपयोग कर सकते हैं, या उत्तर दे सकते हैं। मुश्किल सवालसाक्षात्कार में।