VB.NET में बिटवाइज़ ऑपरेशंस

click fraud protection

VB.NET सीधे बिट स्तर के संचालन का समर्थन नहीं करता है। फ्रेमवर्क 1.1 (VB.NET 2003) ने बिट शिफ्ट ऑपरेटरों को पेश किया (<< तथा >>), लेकिन व्यक्तिगत बिट्स में हेरफेर करने का कोई सामान्य उद्देश्य तरीका उपलब्ध नहीं है। बिट संचालन कर सकते हैं बहुत उपयोगी हो। उदाहरण के लिए, आपके प्रोग्राम को किसी अन्य सिस्टम के साथ इंटरफ़ेस करना पड़ सकता है जिसमें बिट हेरफेर की आवश्यकता होती है। लेकिन इसके अलावा, बहुत सारी तरकीबें हैं जो व्यक्तिगत बिट्स का उपयोग करके की जा सकती हैं। यह आलेख सर्वेक्षण करता है कि VB.NET का उपयोग करके बिट हेरफेर के साथ क्या किया जा सकता है।

आपको समझने की जरूरत है बिटवाइज़ ऑपरेटर कुछ और होने से पहले। VB.NET में, ये हैं:

  • तथा
  • या
  • Xor
  • नहीं

बिटवाइज़ का सीधा सा मतलब है कि परिचालन को दो द्विआधारी संख्याओं पर बिट द्वारा किया जा सकता है। Microsoft उपयोग करता है सत्य सारणी बिटवाइज़ ऑपरेशंस को डॉक्यूमेंट करने के लिए। के लिए सच्चाई तालिका तथा है:

1 बिट 2 बिट परिणाम
1 1 1
1 0 0
0 1 0
0 0 0

मेरे स्कूल में, वे पढ़ाते थे Karnaugh इसके बजाय नक्शे। सभी चार कार्यों के लिए कर्णघ मानचित्र नीचे चित्रण में दिखाया गया है।

instagram viewer


चित्रण प्रदर्शित करने के लिए यहां क्लिक करें
वापस जाने के लिए अपने ब्राउज़र पर बैक बटन पर क्लिक करें

यहाँ एक सरल उदाहरण है तथा दो, चार बिट बाइनरी संख्या के साथ संचालन:

1100 का परिणाम तथा 1010 1000 है।

इसलिए कि १ तथा 1 है 1 (पहला बिट) और बाकी 0 हैं।

शुरुआत करने के लिए, आइए उन बिट संचालन पर एक नज़र डालें जो कर रहे हैं VB.NET में सीधे समर्थित: थोड़ा सा बदलाव. हालाँकि, बाएँ और दाएँ शिफ्ट दोनों उपलब्ध हैं, वे उसी तरह से काम करते हैं इसलिए केवल बाईं पाली पर चर्चा की जाएगी। बिट शिफ्टिंग का उपयोग अक्सर क्रिप्टोग्राफी, इमेज प्रोसेसिंग और संचार में किया जाता है।

VB.NET की बिट्स शिफ्टिंग ऑपरेशन ...

  • केवल चार प्रकार के पूर्णांकों के साथ काम करते हैं: बाइट, कम, पूर्णांक, तथा लंबा
  • कर रहे हैं अंकगणित परिचालन में बदलाव। इसका मतलब है कि परिणाम के अंत में स्थानांतरित किए गए बिट्स को फेंक दिया जाता है, और दूसरे छोर पर खोले गए बिट पदों को शून्य पर सेट किया जाता है। विकल्प को परिपत्र बिट शिफ्टिंग कहा जाता है और पिछले एक छोर पर स्थानांतरित बिट्स को बस दूसरे में जोड़ा जाता है। VB.NET सीधे सर्कुलर बिट शिफ्टिंग का समर्थन नहीं करता है। यदि आपको इसकी आवश्यकता है, तो आपको इसे पुराने ढंग से कोडित करना होगा: 2 से गुणा या विभाजित करना।
  • कभी भी अतिप्रवाह अपवाद उत्पन्न न करें। VB.NET किसी भी संभावित समस्याओं का ध्यान रखता है और मैं आपको दिखाता हूँ कि इसका क्या मतलब है। जैसा कि कहा गया है, आप अपने स्वयं के बिट शिफ्टिंग को 2 से गुणा या विभाजित करके कोड कर सकते हैं, लेकिन यदि आप इसका उपयोग करते हैं "अपना खुद का दृष्टिकोण" कोड, आपको अतिप्रवाह अपवादों के लिए परीक्षण करना होगा जो आपके कार्यक्रम का कारण बन सकता है दुर्घटना।

एक मानक बिट शिफ्टिंग ऑपरेशन कुछ इस तरह दिखाई देगा:

डीम् स्टार्टिंगवैल्यू अस इंटेगर = 14913080
Dim ValueAfterShifting As Integer
ValueAfterShifting = StartValue << 50

शब्दों में, यह ऑपरेशन द्विआधारी मूल्य लेता है 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 समतुल्य दशमलव मान है - ध्यान दें कि यह केवल 3 0 की श्रृंखला है और 3 1 को कुछ बार दोहराया गया है) और इसे 50 स्थानों को छोड़ दिया है। लेकिन चूंकि एक इंटेगर केवल 32 बिट लंबा है, इसलिए इसे 50 स्थानों पर स्थानांतरित करना अर्थहीन है। VB.NET इस समस्या को हल करता है मास्किंग शिफ्ट काउंट एक मानक मान के साथ होता है जो उपयोग किए जा रहे डेटा प्रकार से मेल खाता है। इस मामले में, ValueAfterShifting है एक पूर्णांक इसलिए जो अधिकतम स्थानांतरित किया जा सकता है वह 32 बिट्स है। मानक मुखौटा मूल्य जो काम करता है वह 31 दशमलव या 11111 है।

मास्किंग इसका मतलब है कि मूल्य, इस मामले में 50, है तथामास्क के साथ एड। यह अधिकतम बिट्स देता है जो वास्तव में उस डेटा प्रकार के लिए स्थानांतरित किया जा सकता है।

दशमलव में:

50 और 31 है 18 - बिट्स की अधिकतम संख्या जिसे स्थानांतरित किया जा सकता है

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

110010 और 11111 है 10010

जब कोड स्निपेट निष्पादित होता है, तो परिणाम 954204160 या, बाइनरी में, 0011 1000 1110 0000 0000 0000 0000 0000 होता है। पहले बाइनरी नंबर के बाईं ओर के 18 बिट्स को स्थानांतरित कर दिया जाता है और दाईं ओर के 14 बिट्स को बाईं ओर स्थानांतरित कर दिया जाता है।

शिफ्टिंग बिट्स के साथ अन्य बड़ी समस्या यह है कि क्या होता है जब शिफ्ट करने के लिए स्थानों की संख्या एक नकारात्मक संख्या होती है। आइए, -50 को बिट्स की संख्या के रूप में उपयोग करें और देखें कि क्या होता है।

ValueAfterShifting = StartValue << -50

जब इस कोड स्निपेट को निष्पादित किया जाता है, तो हम -477233152 या 1110 0011 1000 1110 0000 0000 0000 0000 बाइनरी में प्राप्त करते हैं। संख्या को 14 स्थानों पर छोड़ दिया गया है। 14 क्यों? VB.NET मानता है कि स्थानों की संख्या एक अहस्ताक्षरित पूर्णांक है और a तथा एक ही मुखौटा के साथ ऑपरेशन (31 पूर्णांक के लिए)।

1111 1111 1111 1111 1111 1111 1100 1110
0000 0000 0000 0000 0000 0000 0001 1111
(तथा)
0000 0000 0000 0000 0000 0000 0000 1110

बाइनरी में 1110 14 दशमलव है। ध्यान दें कि यह एक सकारात्मक 50 स्थानों को स्थानांतरित करने का रिवर्स है।

अगले पेज पर, हम कुछ अन्य बिट ऑपरेशंस पर जाते हैं, जिनके साथ शुरू होता है Xor एन्क्रिप्शन!

मैंने उल्लेख किया कि बिट ऑपरेशन का एक उपयोग एन्क्रिप्शन है। Xor एन्क्रिप्शन एक फ़ाइल को "एन्क्रिप्ट" करने का एक लोकप्रिय और सरल तरीका है। मेरे लेख में, VB.NET का उपयोग करते हुए बहुत सरल एन्क्रिप्शन, मैं आपको इसके बजाय स्ट्रिंग हेरफेर का उपयोग करने का एक बेहतर तरीका दिखाता हूं। लेकिन Xor एन्क्रिप्शन इतना आम है कि इसे कम से कम समझाया जाना चाहिए।

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

Xor एन्क्रिप्शन को "सममित एल्गोरिथम" कहा जाता है। इसका मतलब है कि हम एन्क्रिप्शन कुंजी को डिक्रिप्शन कुंजी के रूप में भी उपयोग कर सकते हैं।

चलो कुंजी के रूप में "ए" का उपयोग करें और "बेसिक" शब्द को एन्क्रिप्ट करें। "A" के लिए ASCII कोड है:

0100 0001 (दशमलव 65)

बेसिक के लिए ASCII कोड है:

बी - 0100 0010
a - 0110 0001
s - 0111 0011
i - 0110 1001
c - 0110 0011

Xor इनमें से प्रत्येक है:

0000 0011 - दशमलव 3
0010 0000 - दशमलव 32
0011 0010 - दशमलव 50
0010 1000 - दशमलव 40
0010 0010 - दशमलव 34

इस छोटी सी दिनचर्या की चाल:

- Xor एन्क्रिप्शन -
मंद आई ऐज़ शॉर्ट
ResultString। पाठ = ""
इंटीजर के रूप में डिम कीचर
KeyChar = Asc (Enc एन्क्रिप्शनKey)। पाठ)
I = 1 के लिए लेन (InputString)। पाठ)
ResultString। पाठ और = _
Chr (कीचर Xor _
Asc (मिड (InputString)। पाठ, i, 1)))
आगे

परिणाम इस चित्रण में देखा जा सकता है:


चित्रण प्रदर्शित करने के लिए यहां क्लिक करें
वापस जाने के लिए अपने ब्राउज़र पर बैक बटन पर क्लिक करें

एन्क्रिप्शन को उलटने के लिए, स्ट्रिंग स्ट्रिंग टेक्स्ट बॉक्स में वापस रिजल्ट टेक्स्टबॉक्स से स्ट्रिंग को कॉपी और पेस्ट करें और फिर से बटन पर क्लिक करें।

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

दिम फर्स्ट आईंट अस इंटेगर
डिगर सेकेंडआईंट इंटेगर
FirstInt = CInt (FirstIntBox) पाठ)
SecondInt = CInt (SecondIntBox)। पाठ)
FirstInt = FirstInt Xor SecondInt
SecondInt = FirstInt Xor SecondInt
FirstInt = FirstInt Xor SecondInt
ResultBox। पाठ = "प्रथम पूर्णांक:" और _
FirstInt। तार & " - " & _
"दूसरा पूर्णांक:" और _
SecondInt। तार

और यहाँ कार्रवाई में कोड है:


चित्रण प्रदर्शित करने के लिए यहां क्लिक करें
वापस जाने के लिए अपने ब्राउज़र पर बैक बटन पर क्लिक करें

यह पता लगाना कि यह कार्य "छात्र के लिए एक अभ्यास" के रूप में क्यों छोड़ा जाएगा।

अगले पृष्ठ पर, हम लक्ष्य तक पहुँचते हैं: जनरल बिट मैनिपुलेशन

हालांकि ये ट्रिक्स मज़ेदार और शैक्षिक हैं, फिर भी वे सामान्य बिट हेरफेर के लिए कोई विकल्प नहीं हैं। यदि आप वास्तव में बिट्स के स्तर तक नीचे आते हैं, तो आप जो चाहते हैं वह व्यक्तिगत बिट्स की जांच करने, उन्हें सेट करने या उन्हें बदलने का एक तरीका है। यह वास्तविक कोड है जो .NET से गायब है।

शायद इसका कारण यह है कि यह सबरूटीन्स लिखने में उतना कठिन नहीं है जो एक ही बात को पूरा करे।

एक विशिष्ट कारण जिसे आप करना चाहते हैं वह यह है कि जिसे कभी-कभी कहा जाता है उसे बनाए रखना है झंडा बाइट. कुछ अनुप्रयोग, विशेष रूप से जो निम्न स्तर की भाषाओं में लिखे गए हैं जैसे कोडांतरक, एक बाइट में आठ बूलियन झंडे बनाए रखेंगे। उदाहरण के लिए, 6502 प्रोसेसर चिप का स्टेटस रजिस्टर एक एकल 8 बिट बाइट में इस जानकारी को रखता है:

बिट 7। नकारात्मक ध्वज
बिट ६। ओवरफ्लो झंडा
बिट ५। अप्रयुक्त
बिट ४। झंडा तोड़ो
बिट ३। दशम ध्वज
बिट २। बाधित-अक्षम ध्वज
बिट १। शून्य ध्वज
बिट ०। झंडे को ले जाना

(विकिपीडिया से)

यदि आपके कोड को इस तरह के डेटा के साथ काम करना है, तो आपको सामान्य उद्देश्य बिट हेरफेर कोड की आवश्यकता है। यह कोड काम करेगा!

'The ClearBit Sub 1 आधारित, nth बिट को साफ करता है
एक पूर्णांक (MyByte) का '(MyBit)'।
उप ClearBit (ByRef MyByte, ByVal MyBit)
Int16 के रूप में डिम बिटमास्क
'2 से nth पावर बिट सेट के साथ एक बिटमास्क बनाएँ:
BitMask = 2 ^ (MyBit - 1)
'Nth बिट साफ़ करें:
MyByte = MyByte और BitMask नहीं
अंत उप
'ExamineBit फ़ंक्शन सही या गलत लौटेगा
'1 आधारित, nth बिट (MyBit) के मूल्य पर निर्भर करता है
'एक पूर्णांक (MyByte) की।
बूलियन के रूप में फंक्शन एक्साम्बिनिट (बायवाल मायबाइट, बायवैल माइबिट)
Int16 के रूप में डिम बिटमास्क
BitMask = 2 ^ (MyBit - 1)
परीक्षा = ((MyByte और BitMask)> 0)
अंत समारोह
'द सेटबिट सब 1 आधारित, nth बिट सेट करेगा
एक पूर्णांक (MyByte) का '(MyBit)'।
उप सेटबिट (ByRef MyByte, ByVal MyBit)
Int16 के रूप में डिम बिटमास्क
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte या BitMask
अंत उप
'द टॉगलबिट सब राज्य बदल जाएगा
1 आधारित, nth बिट (MyBit)
'एक पूर्णांक (MyByte) की।
उप टॉगलबिट (ByRef MyByte, ByVal MyBit)
Int16 के रूप में डिम बिटमास्क
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte Xor BitMask
अंत उप

कोड प्रदर्शित करने के लिए, यह रूटीन इसे कॉल करता है (पैरामीटर क्लिक उप पर कोडित नहीं है):

निजी उप ExBitCode_Click (...
डिम बाइट 1, बाइट 2 बाइट के रूप में
डिम मायबाइट, मायबिट
बूलियन के रूप में मंद स्थितिऑफबिट
स्ट्रिंग के रूप में डिम SelectRB
StatusLine। पाठ = ""
चयनितRB = GetCheckedRadioButton (Me) .Name
बाइट 1 = बाइटनेम। टेक्स्ट का नंबर बिट फ्लैग्स में परिवर्तित किया जाना है
बाइट 2 = बिटनम। पाठ 'बिट to beled
'निम्नलिखित उच्च आदेश बाइट को साफ करता है और केवल लौटता है
'कम ऑर्डर बाइट:
MyByte = Byte1 और HFF
MyBit = बाइट 2
केस सेलेक्ट आरआरबी चुनें
केस "ClearBitButton"
ClearBit (MyByte, MyBit)
StatusLine। पाठ = "नया बाइट:" और मायबाइट
केस "ExamineBitButton"
StatusOfBit = ExamineBit (MyByte, MyBit)
StatusLine। पाठ = "बिट" और MyBit और _
"है" और StatusOfBit
केस "सेटबिटबटन"
सेटबिट (MyByte, MyBit)
StatusLine। पाठ = "नया बाइट:" और मायबाइट
केस "टॉगलबिटबटन"
टॉगलबिट (MyByte, MyBit)
StatusLine। पाठ = "नया बाइट:" और मायबाइट
अंत का चयन करें
अंत उप
निजी समारोह GetCheckedRadioButton (_
बायल पेरेंट कंट्रोल के रूप में) _
रेडियोबटन के रूप में
नियंत्रण के रूप में मंद FormControl
रेडियोबटन के रूप में डिम आरबी
माता-पिता में प्रत्येक फॉर्मकंट्रोल के लिए। नियंत्रण
अगर फॉर्मकंट्रोल। GetType () GetType (RadioButton) है
आरबी = डायरेक्टकास्ट (फॉर्मकंट्रोल, रेडियोबटन)
यदि RB.Checked है तो RB वापस करें
अगर अंत
आगे
रिटर्न नथिंग
अंत समारोह

कोड इन एक्शन इस तरह दिखता है:


चित्रण प्रदर्शित करने के लिए यहां क्लिक करें
वापस जाने के लिए अपने ब्राउज़र पर बैक बटन पर क्लिक करें

instagram story viewer