Bitwise Operations στο VB.NET

Το VB.NET δεν υποστηρίζει άμεσα λειτουργίες επιπέδου δυαδικών ψηφίων. Το Πλαίσιο 1.1 (VB.NET 2003) εισήγαγε τους χειριστές βημάτων (<< και >>), αλλά δεν διατίθεται κανένας γενικός σκοπός για χειρισμό μεμονωμένων δυαδικών ψηφίων. Λειτουργίες bit μπορώ να είναι πολύ χρήσιμο. Για παράδειγμα, το πρόγραμμά σας μπορεί να χρειάζεται να συνδεθεί με ένα άλλο σύστημα που απαιτεί χειρισμό bit. Αλλά επιπλέον, υπάρχουν πολλά κόλπα που μπορούν να γίνουν χρησιμοποιώντας μεμονωμένα bits. Αυτό το άρθρο ερευνά τι μπορεί να γίνει με χειρισμό bit χρησιμοποιώντας VB.NET.

Πρέπει να καταλάβετε bit πριν από οτιδήποτε άλλο. Στο VB.NET, αυτά είναι:

  • Και
  • Ή
  • Xor
  • Δεν

Bitwise απλά σημαίνει ότι οι λειτουργίες μπορούν να εκτελεστούν σε δύο δυαδικούς αριθμούς λίγο bit. Η Microsoft χρησιμοποιεί Πίνακες αλήθειας για την τεκμηρίωση των πράξεων bitwise. Ο πίνακας της αλήθειας για Και είναι:

Αποτέλεσμα πρώτου δυαδικού ψηφίου δυφίων
1 1 1
1 0 0
0 1 0
0 0 0

Στο σχολείο μου δίδαξαν Κάρναου χάρτες αντί. Ο χάρτης Karnaugh και για τις τέσσερις λειτουργίες παρουσιάζεται στην παρακάτω εικόνα.

instagram viewer


Κάντε κλικ εδώ για να εμφανίσετε την εικόνα
Κάντε κλικ στο κουμπί Επιστροφή στο πρόγραμμα περιήγησής σας για να επιστρέψετε

Ακολουθεί ένα απλό παράδειγμα χρησιμοποιώντας το Και λειτουργία με δύο, τεσσάρων δυαδικών ψηφίων:

Το αποτέλεσμα του 1100 Και Το 1010 είναι 1000.

Αυτό συμβαίνει επειδή 1 Και Το 1 είναι 1 (το πρώτο bit) και το υπόλοιπο είναι 0.

Αρχικά, ας ρίξουμε μια ματιά στις λειτουργίες bit που είναι υποστηρίζεται άμεσα στο VB.NET: bit μετατόπιση. Παρόλο που είναι διαθέσιμο τόσο η αριστερή βάρδια όσο και η δεξιά μετατόπιση, λειτουργούν με τον ίδιο τρόπο, ώστε να συζητείται μόνο η αριστερή στροφή. Η μετατόπιση δυαδικών ψηφίων χρησιμοποιείται συχνότερα στην κρυπτογραφία, την επεξεργασία εικόνων και τις επικοινωνίες.

Οι λειτουργίες αλλαγής bit του VB.NET ...

  • Λειτουργεί μόνο με τους τέσσερις τύπους ακεραίων: Ψηφιόλεξη, Μικρός, Ακέραιος αριθμός, και Μακρύς
  • Είναι αριθμητική μετατόπισης. Αυτό σημαίνει ότι τα μπιτ που μετατοπίζονται πέρα ​​από το τέλος του αποτελέσματος απορρίπτονται και οι θέσεις bit που ανοίγουν στο άλλο άκρο είναι μηδενικές. Η εναλλακτική λύση ονομάζεται κυκλική μετατόπιση δυαδικών ψηφίων και τα κομμάτια που μετατοπίζονται πέρα ​​από το ένα άκρο προστίθενται απλά στο άλλο. Το VB.NET δεν υποστηρίζει άμεσα την κυκλική μετατόπιση bit. Εάν το χρειάζεστε, θα πρέπει να κωδικοποιήσετε τον παλιό τρόπο: πολλαπλασιάζοντας ή διαιρώντας με 2.
  • Ποτέ μην δημιουργείτε μια εξαίρεση υπερχείλισης. Το VB.NET φροντίζει για τυχόν προβλήματα και θα σας δείξω τι σημαίνει αυτό. Όπως σημειώνεται, μπορείτε να κωδικοποιήσετε τη δική σας μετατόπιση bit πολλαπλασιάζοντας ή διαιρώντας κατά 2, αλλά αν χρησιμοποιήσετε το "κωδικοποιήστε τη δική σας" προσέγγιση, πρέπει να ελέγξετε για εξαιρέσεις υπερχείλισης που μπορούν να προκαλέσουν το πρόγραμμά σας δυστύχημα.

Μια τυποποιημένη λειτουργία αλλαγής bit θα φαίνεται κάπως έτσι:

Dim StartValue ως ακέραιο = 14913080
Τιμή DimAfterShifting ως ακέραιο
ValueAfterShifting = StartingValue << 50

Με λέξεις, αυτή η λειτουργία παίρνει τη δυαδική τιμή 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 είναι η ισοδύναμη δεκαδική τιμή - παρατηρήστε ότι είναι απλώς μια σειρά 3 0 και 3 1 επαναλαμβανόμενες μερικές φορές) και μετατοπίζει 50 θέσεις αριστερά. Αλλά δεδομένου ότι ένα ακέραιο έχει μήκος μόνο 32 bits, η μετατόπιση σε 50 θέσεις δεν έχει νόημα. Το VB.NET λύνει αυτό το πρόβλημα με συγκάλυψη η μέτρηση βάρδιας με μια τυπική τιμή που ταιριάζει με τον τύπο δεδομένων που χρησιμοποιείται. Σε αυτήν την περίπτωση, ValueAfterShifting είναι ένα Ακέραιος αριθμός έτσι το μέγιστο που μπορεί να μετατοπιστεί είναι 32 bits. Η τυπική τιμή μάσκας που λειτουργεί είναι 31 δεκαδικά ή 11111.

Συγκάλυψη σημαίνει ότι η τιμή, στην περίπτωση αυτή 50, είναι Καιμε τη μάσκα. Αυτό δίνει τον μέγιστο αριθμό bits που μπορούν να μετατοπιστούν για αυτόν τον τύπο δεδομένων.

Στο δεκαδικό:

50 και 31 είναι 18 - Ο μέγιστος αριθμός bits που μπορούν να μετατοπιστούν

Στην πραγματικότητα έχει μεγαλύτερη σημασία στο δυαδικό. Τα bits υψηλής τάξης που δεν μπορούν να χρησιμοποιηθούν για τη λειτουργία μετατόπισης απομακρύνονται απλά.

110010 και 11111 είναι 10010

Όταν εκτελεστεί το απόσπασμα κώδικα, το αποτέλεσμα είναι 954204160 ή, δυαδικά, 0011 1000 1110 0000 0000 0000 0000 0000. Τα 18 bits στην αριστερή πλευρά του πρώτου δυαδικού αριθμού μετατοπίζονται και τα 14 bits στη δεξιά πλευρά μετατοπίζονται αριστερά.

Το άλλο μεγάλο πρόβλημα με τη μετατόπιση των δυαδικών ψηφίων είναι αυτό που συμβαίνει όταν ο αριθμός των θέσεων για μετατόπιση είναι αρνητικός. Ας χρησιμοποιήσουμε -50 ως τον αριθμό των bits για αλλαγή και να δούμε τι συμβαίνει.

ValueAfterShifting = StartingValue << -50

Όταν αυτό το απόσπασμα κώδικα εκτελεστεί, έχουμε το -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 σε δυαδικό είναι δεκαδικό δεκαδικό. Παρατηρήστε ότι αυτή είναι η αντίστροφη μετατόπιση ενός θετικού 50 θέσεων.

Στην επόμενη σελίδα, θα προχωρήσουμε σε κάποιες άλλες λειτουργίες bit, αρχίζοντας από Xor κρυπτογράφηση!

Ανέφερα ότι μία χρήση των λειτουργιών bit είναι κρυπτογράφηση. Η κρυπτογράφηση 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
ί-0110 1001
c-0110 0011

ο Xor από κάθε ένα από αυτά είναι:

0000 0011 - δεκαδικό 3
0010 0000 - δεκαδικό 32
0011 0010 - δεκαδικό 50
0010 1000 - δεκαδικό 40
0010 0010 - δεκαδικό 34

Αυτή η μικρή ρουτίνα κάνει το τέχνασμα:

- Xor Κρυπτογράφηση -
Dim i As Short
String αποτελεσμάτων. Κείμενο = ""
Dim KeyChar ως ακέραιο
KeyChar = Asc (EncryptionKey. Κείμενο)
Για το i = 1 To Len (InputString. Κείμενο)
String αποτελεσμάτων. Κείμενο & = _
Chr (KeyChar Xor _
Asc (Μέσο (είσοδος γραμμής. Κείμενο, i, 1)))
Επόμενο

Το αποτέλεσμα μπορεί να φανεί σε αυτό το παράδειγμα:


Κάντε κλικ εδώ για να εμφανίσετε την εικόνα
Κάντε κλικ στο κουμπί Επιστροφή στο πρόγραμμα περιήγησής σας για να επιστρέψετε

Για να αναστρέψετε την κρυπτογράφηση, απλά αντιγράψτε και επικολλήστε τη συμβολοσειρά από το TextBox Αποτέλεσμα πίσω στο String TextBox και κάντε ξανά κλικ στο κουμπί.

Ένα άλλο παράδειγμα κάτι που μπορείτε να κάνετε με τους δυαδικούς χειριστές είναι να ανταλλάξετε δύο αληθή στοιχεία χωρίς να δηλώσετε μια τρίτη μεταβλητή για προσωρινή αποθήκευση. Αυτά είναι τα πράγματα που έκαναν στα προγράμματα γλωσσών συναρμολόγησης εδώ και χρόνια. Δεν είναι πολύ χρήσιμο τώρα, αλλά μπορεί να κερδίσετε ένα στοίχημα κάποια μέρα αν βρείτε κάποιον που δεν πιστεύει ότι μπορείτε να το κάνετε. Σε κάθε περίπτωση, αν έχετε ακόμα ερωτήσεις σχετικά με τον τρόπο Xor τα έργα που εργάζονται μέσω αυτού πρέπει να τα βάλουν σε ανάπαυση. Εδώ είναι ο κώδικας:

Dim FirstInt ως ακέραιο
Dim SecondInt ως ακέραιο
FirstInt = CInt (FirstIntBox. Κείμενο)
SecondInt = CInt (SecondIntBox. Κείμενο)
FirstInt = FirstInt Χωρίς δευτερεύοντα
SecondInt = FirstInt Xor δευτερεύον
FirstInt = FirstInt Χωρίς δευτερεύοντα
Αποτέλεσμα. Κείμενο = "Πρώτο ακέραιο:" & _
FirstInt. ToString & "-" & _
"Δεύτερο ακέραιο:" & _
SecondInt. ToString

Και εδώ είναι ο κώδικας σε δράση:


Κάντε κλικ εδώ για να εμφανίσετε την εικόνα
Κάντε κλικ στο κουμπί Επιστροφή στο πρόγραμμα περιήγησής σας για να επιστρέψετε

Αναγνωρίζοντας ακριβώς γιατί αυτά τα έργα θα μείνουν ως "ως άσκηση για τον μαθητή".

Στην επόμενη σελίδα φτάνουμε στο στόχο: General Man Handling

Παρόλο που αυτά τα κόλπα είναι διασκεδαστικά και εκπαιδευτικά, δεν είναι ακόμα υποκατάστατο του γενικού χειρισμού bit. Αν πραγματικά φτάσετε στο επίπεδο των δυαδικών ψηφίων, αυτό που θέλετε είναι ένας τρόπος να εξετάσετε μεμονωμένα κομμάτια, να τα ορίσετε ή να τα αλλάξετε. Αυτός είναι ο πραγματικός κώδικας που λείπει από το .NET.

Ίσως ο λόγος που λείπει είναι ότι δεν είναι τόσο δύσκολο να γράψεις υπορουτίνες που να επιτελούν το ίδιο πράγμα.

Ένας τυπικός λόγος που ίσως θέλετε να κάνετε αυτό είναι να διατηρήσετε αυτό που μερικές φορές ονομάζεται α σημαία byte. Ορισμένες εφαρμογές, ειδικά εκείνες που είναι γραμμένες σε γλώσσες χαμηλού επιπέδου, όπως το assembler, θα διατηρούν οκτώ boolean σημαίες σε ένα μοναδικό byte. Για παράδειγμα, ένας κατάλογος καταγραφής κατάστασης του τσιπ επεξεργαστή 6502 κρατά αυτές τις πληροφορίες σε ένα byte 8 δυφίων:

Bit 7. Αρνητική σημαία
Bit 6. Σημαία υπερχείλισης
Bit 5. Αχρησιμοποίητος
Bit 4. Σημαία διακοπής
Bit 3. Δεκαδική σημαία
Bit 2. Διακοπή-απενεργοποίηση σημαίας
Bit 1. Μηδενική σημαία
Bit 0. Σημαία Carry

(από τη Βικιπαίδεια)

Εάν ο κώδικας σας πρέπει να λειτουργεί με αυτό το είδος δεδομένων, χρειάζεστε κώδικα γενικού χειρισμού bit. Αυτός ο κώδικας θα κάνει τη δουλειά!

'Το ClearBit Sub καθαρίζει το 1ο, 1ο bit
'(MyBit) ενός ακέραιου αριθμού (MyByte).
Sub ClearBit (ByRef MyByte, ByVal MyBit)
Dim BitMask ως Int16
'Δημιουργία μίας μάσκας bit με το 2 προς το nth bit bit set:
BitMask = 2 ^ (MyBit-1)
'Καθαρίστε το nth Bit:
MyByte = MyByte και όχι BitMask
End Sub
'Η συνάρτηση ExamineBit θα επιστρέψει True ή False
'ανάλογα με την τιμή του 1ου bit (MyBit)
'ενός ακέραιου (MyByte).
Λειτουργία ExamineBit (ByVal MyByte, ByVal MyBit) Ως Boolean
Dim BitMask ως Int16
BitMask = 2 ^ (MyBit-1)
ExamineBit = ((MyByte και BitMask)> 0)
Λειτουργία τερματισμού
"Το SetBit Sub θα ορίσει το 1ο bit που βασίζεται στο 1ο
'(MyBit) ενός ακέραιου αριθμού (MyByte).
Sub SetBit (ByRef MyByte, ByVal MyBit)
Dim BitMask ως Int16
BitMask = 2 ^ (MyBit-1)
MyByte = MyByte ή BitMask
End Sub
'Το ToggleBit Sub θα αλλάξει την κατάσταση
'του 1ου βασιζόμενου, nth bit (MyBit)
'ενός ακέραιου (MyByte).
Sub ToggleBit (ByRef MyByte, ByVal MyBit)
Dim BitMask ως Int16
BitMask = 2 ^ (MyBit-1)
MyByte = MyByte Xor BitMask
End Sub

Για να επιδείξει τον κώδικα, αυτή η ρουτίνα το καλεί (παραμέτρους που δεν κωδικοποιούνται στο Click Sub):

Private Sub ExBitCode_Click (...
Dim Byte1, Byte2 ως Byte
Dim MyByte, MyBit
Dim StatusOfBit ως Boolean
Dim SelectedRB ως συμβολοσειρά
StatusLine. Κείμενο = ""
ΕπιλεγμένοRB = GetCheckedRadioButton (Me) .Name
Byte1 = ByteNum. Κείμενο "Αριθμός που πρέπει να μετατραπεί σε Bit Σημαίες
Byte2 = BitNum. Το κείμενο 'Bit to be switched
'Τα παρακάτω διαγράφουν το byte υψηλής τάξης και επιστρέφουν μόνο το byte
'byte χαμηλής τάξης:
MyByte = Byte1 και & HFF
MyBit = Byte2
Επιλέξτε Case SelectedRB
Θήκη "ClearBitButton"
ClearBit (MyByte, MyBit)
StatusLine. Κείμενο = "Νέο Byte:" & MyByte
Περίπτωση "ExamineBitButton"
StatusOfBit = ExamineBit (MyByte, MyBit)
StatusLine. Text = "Bit" & MyBit & _
"είναι" & StatusOfBit
Θήκη "SetBitButton"
SetBit (MyByte, MyBit)
StatusLine. Κείμενο = "Νέο Byte:" & MyByte
Θήκη "ToggleBitButton"
ToggleBit (MyByte, MyBit)
StatusLine. Κείμενο = "Νέο Byte:" & MyByte
Τέλος Επιλογή
End Sub
Ιδιωτική λειτουργία GetCheckedRadioButton (_
ByVal γονέας ως έλεγχος) _
Ως RadioButton
Dim FormControl ως έλεγχος
Dim RB As RadioButton
Για κάθε FormControl στη μητρική. Έλεγχοι
Αν FormControl. GetType () Είναι GetType (RadioButton) Στη συνέχεια
RB = DirectCast (FormControl, RadioButton)
Εάν RB.Checked Then Return RB
Τέλος εαν
Επόμενο
Επιστροφή Τίποτα
Λειτουργία τερματισμού

Ο κώδικας σε δράση μοιάζει με αυτόν τον τρόπο:


Κάντε κλικ εδώ για να εμφανίσετε την εικόνα
Κάντε κλικ στο κουμπί Επιστροφή στο πρόγραμμα περιήγησής σας για να επιστρέψετε

instagram story viewer