لا يدعم VB.NET عمليات مستوى البت مباشرة. إطار 1.1 (VB.NET 2003) قدم مشغلي التحول قليلا (<< و >>) ، ولكن لا توجد طريقة للأغراض العامة للتعامل مع البتات الفردية. عمليات قليلا يستطيع تكون مفيدة للغاية. على سبيل المثال ، قد يضطر برنامجك إلى التفاعل مع نظام آخر يتطلب معالجة بت. ولكن بالإضافة إلى ذلك ، هناك الكثير من الحيل التي يمكن القيام بها باستخدام أجزاء فردية. تستعرض هذه المقالة ما يمكن القيام به مع معالجة البت باستخدام VB.NET.
تحتاج الى ان تفهم مشغلي bitwise قبل أي شيء آخر. في VB.NET ، هذه هي:
- و
- أو
- Xor
- ليس
يعني Bitwise ببساطة أنه يمكن تنفيذ العمليات على رقمين ثنائيين شيئًا فشيئًا. تستخدم مايكروسوفت جداول الحقيقة لتوثيق عمليات أحادية البت. جدول الحقيقة و يكون:
نتيجة البت الأول نتيجة البت الثاني
1 1 1
1 0 0
0 1 0
0 0 0
في مدرستي ، علموا كارنو خرائط بدلا من ذلك. خريطة Karnaugh لجميع العمليات الأربع موضحة في الرسم التوضيحي أدناه.
انقر هنا لعرض الرسم التوضيحي
انقر فوق الزر "السابق" في المستعرض الخاص بك للعودة
هنا مثال بسيط باستخدام و العملية مع اثنين ، أربعة أرقام ثنائية بت:
نتيجة 1100 و 1010 هو 1000.
ذلك لأن 1 و 1 هو 1 (البتة الأولى) والباقي 0.
بادئ ذي بدء ، دعونا نلقي نظرة على عمليات بت ذلك هي معتمد مباشرة في VB.NET: تحول قليلا. على الرغم من توفر كل من المفتاحين الأيسر والإزاحة اليمنى ، إلا أنهما يعملان بنفس الطريقة ، لذا ستتم مناقشة التحول الأيسر فقط. غالبًا ما يستخدم تبديل البت في التشفير ومعالجة الصور والاتصالات.
عمليات نقل البت في VB.NET ...
- تعمل فقط مع الأنواع الأربعة للأعداد الصحيحة: بايت, قصيرة, عدد صحيحو طويل
- هل علم الحساب عمليات التحول. هذا يعني أن البتات التي تم تغييرها بعد نهاية النتيجة يتم إلقاؤها ، ويتم ضبط أوضاع البت المفتوحة على الطرف الآخر على الصفر. يُطلق على البديل إزاحة البت الدائرية ويتم ببساطة إضافة البتات التي يتم إزاحتها بعد نهاية واحدة إلى الطرف الآخر. VB.NET لا يدعم تحويل البت الدائري مباشرة. إذا كنت في حاجة إليها ، فسيتعين عليك ترميزها بالطريقة القديمة: الضرب أو القسمة على 2.
- لا تنشئ أبدًا استثناء فيضان. تهتم VB.NET بأي مشاكل محتملة وسأريك ما يعنيه ذلك. كما لوحظ ، يمكنك كتابة رمز التبديل الخاص بك عن طريق ضرب أو قسمة على 2 ، ولكن إذا كنت تستخدم نهج "الرمز الخاص بك" ، يجب عليك اختبار استثناءات تجاوز السعة التي يمكن أن تسبب البرنامج الخاص بك يصطدم.
قد تبدو عملية تغيير البت القياسية شيئًا مثل هذا:
خافت StartingValue باسم عدد صحيح = 14913080
Dim ValueAfterShifting باسم عدد صحيح
ValueAfterShifting = StartingValue << 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 = قيمة البداية
عندما يتم تنفيذ مقتطف الرمز هذا ، نحصل على -477233152 أو 1110 0011 1000 1110 0000 0000 0000 0000 في ثنائي. تم تحويل الرقم إلى 14 مكانًا متبقيًا. لماذا 14؟ يفترض VB.NET أن عدد الأماكن هو عدد صحيح بدون إشارة ويقوم بإجراء و العملية بنفس القناع (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" كمفتاح وتشفير كلمة "Basic". رمز ASCII لـ "A" هو:
0100 0001 (رقم عشري 65)
رمز ASCII لـ Basic هو:
ب - 0100 0010
- 0110 0001
s - 0111 0011
i - 0110 1001
ج - 0110 0011
ال Xor كل من هذه هي:
0000 0011 - رقم عشري 3
0010 0000 - رقم عشري 32
0011 0010 - رقم عشري 50
0010 1000 - رقم عشري 40
0010 0010 - رقم عشري 34
هذا الروتين الصغير يفعل الحيلة:
- تشفير Xor -
Dim i As Short
سلسلة النتائج. نص = ""
Dim KeyChar As Integer
KeyChar = Asc (EncryptionKey. نص)
من أجل i = 1 إلى Len (InputString. نص)
سلسلة النتائج. نص & = _
Chr (KeyChar Xor _)
تصاعدي (منتصف (InputString. نص ، ط ، 1)))
التالى
يمكن رؤية النتيجة في هذا الرسم التوضيحي:
انقر هنا لعرض الرسم التوضيحي
انقر فوق الزر "السابق" في المستعرض الخاص بك للعودة
لعكس التشفير ، ما عليك سوى نسخ ولصق السلسلة من Result TextBox في String TextBox والنقر فوق الزر مرة أخرى.
مثال آخر على شيء يمكنك القيام به مع عوامل تشغيل bitwise هو تبديل اثنين من الأرقام الصحيحة دون الإعلان عن متغير ثالث للتخزين المؤقت. هذا هو الشيء الذي اعتادوا فعله في برامج لغة التجميع منذ سنوات. إنها ليست مفيدة للغاية الآن ، ولكنك قد تربح رهانًا يومًا ما إذا تمكنت من العثور على شخص لا يعتقد أنه يمكنك فعل ذلك. على أي حال ، إذا كان لا يزال لديك أسئلة حول الكيفية Xor يعمل ، من خلال هذا يجب أن يضعهم في الراحة. إليك الرمز:
Dim FirstInt As Integer
Dim SecondInt As Integer
FirstInt = CInt (FirstIntBox. نص)
SecondInt = CInt (SecondIntBox. نص)
FirstInt = FirstInt Xor SecondInt
SecondInt = FirstInt Xor SecondInt
FirstInt = FirstInt Xor SecondInt
ResultBox. Text = "First Integer:" & _
FirstInt. إلى سلسلة & " - " & _
"العدد الصحيح الثاني" & _
SecondInt. إلى سلسلة
وإليك الرمز قيد التنفيذ:
انقر هنا لعرض الرسم التوضيحي
انقر فوق الزر "السابق" في المستعرض الخاص بك للعودة
معرفة سبب ترك هذا العمل "كتمرين للطالب".
في الصفحة التالية ، نصل إلى الهدف: المعالجة العامة للبت
على الرغم من أن هذه الحيل ممتعة وتعليمية ، إلا أنها لا تزال لا بديل عن التلاعب العام بالبت. إذا وصلت بالفعل إلى مستوى البتات ، فإن ما تريده هو طريقة لفحص البتات الفردية أو تعيينها أو تغييرها. هذا هو الرمز الحقيقي المفقود من .NET.
ربما يكون سبب فقدها هو أنه ليس من الصعب كتابة روتينات فرعية تحقق نفس الشيء.
أحد الأسباب النموذجية التي قد ترغب في القيام بها هو الحفاظ على ما يسمى أحيانًا بـ علم البايت. بعض التطبيقات ، خاصة تلك المكتوبة بلغات منخفضة المستوى مثل المجمع ، ستحتفظ بثمانية أعلام منطقية في بايت واحد. على سبيل المثال ، يحمل سجل حالة رقاقة معالج 6502 هذه المعلومات في بايت واحد 8 بت:
بت 7. علم سلبي
بت 6. علم تجاوز
بت 5. غير مستعمل
بت 4. كسر العلم
بت 3. علامة عشرية
بت 2. إشارة تعطيل المقاطعة
بت 1. علم صفر
بت 0. حمل العلم
(من ويكيبيديا)
إذا كان يجب أن يعمل الكود الخاص بك مع هذا النوع من البيانات ، فأنت بحاجة إلى كود معالجة بت للأغراض العامة. هذا الكود سيقوم بالمهمة
'ClearBit Sub يمسح البت الأول nth
(MyBit) من عدد صحيح (MyByte).
Sub ClearBit (ByRef MyByte ، ByVal MyBit)
خافت BitMask كما Int16
'إنشاء قناع بت من 2 إلى مجموعة بت الطاقة nth:
BitMask = 2 ^ (MyBit - 1)
امسح البت التاسع:
MyByte = MyByte وليس BitMask
نهاية فرعية
'سترجع الدالة ExamineBit صواب أو خطأ
"اعتمادًا على قيمة البتة n القائمة (MyBit) 1
'من عدد صحيح (MyByte).
الوظيفة ExamineBit (ByVal MyByte ، ByVal MyBit) باعتبارها منطقية
خافت BitMask كما Int16
BitMask = 2 ^ (MyBit - 1)
ExamineBit = ((MyByte و BitMask)> 0)
وظيفة النهاية
'سيضبط SetBit Sub على البت الأول nth
(MyBit) من عدد صحيح (MyByte).
مجموعة فرعية (ByRef MyByte ، ByVal MyBit)
خافت BitMask كما Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte أو BitMask
نهاية فرعية
'ستغير ToggleBit Sub الحالة
'من بت واحد ، nth bit (MyBit)
'من عدد صحيح (MyByte).
Sub ToggleBit (ByRef MyByte ، ByVal MyBit)
خافت BitMask كما Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte Xor BitMask
نهاية فرعية
لتوضيح الكود ، يطلق عليه هذا الروتين (المعلمات غير المشفرة على Click Sub):
ExBitCode_Click الفرعية الخاصة (...
Dim Byte1، Byte2 As Byte
خافت MyByte ، MyBit
Dim StatusOfBit As Boolean
Dim SelectedRB As String
خط الحالة. نص = ""
SelectedRB = GetCheckedRadioButton (Me) .Name
Byte1 = ByteNum. تحويل الرقم النصي إلى أعلام بت
Byte2 = BitNum. النص 'بت ليتم تبديله
ما يلي يمسح البايت عالي الترتيب ويعيد فقط
"ترتيب منخفض البايت:
MyByte = Byte1 و & HFF
MyBit = Byte2
حدد Case SelectRB
الحالة "ClearBitButton"
ClearBit (MyByte ، MyBit)
خط الحالة. Text = "New Byte:" & MyByte
الحالة "ExamineBitButton"
StatusOfBit = ExamineBit (MyByte ، MyBit)
خط الحالة. Text = "Bit" & MyBit & _
"is" & StatusOfBit
الحالة "SetBitButton"
SetBit (MyByte ، MyBit)
خط الحالة. Text = "New Byte:" & MyByte
الحالة "ToggleBitButton"
ToggleBit (MyByte ، MyBit)
خط الحالة. Text = "New Byte:" & MyByte
حدد النهاية
نهاية فرعية
الوظيفة الخاصة GetCheckedRadioButton (_
ByVal Parent As Control) _
كما RadioButton
Dim FormControl As Control
Dim RB As RadioButton
لكل FormControl في الأصل. ضوابط
إذا FormControl. GetType () هو GetType (RadioButton) ثم
RB = DirectCast (FormControl ، RadioButton)
إذا تم تحديد RB ثم أعد RB
إنهاء إذا
التالى
إرجاع أي شيء
وظيفة النهاية
يبدو الرمز في العمل كما يلي:
انقر هنا لعرض الرسم التوضيحي
انقر فوق الزر "السابق" في المستعرض الخاص بك للعودة