Bitvis drift i VB.NET

VB.NET understøtter ikke operationer på bitniveau direkte. Framework 1.1 (VB.NET 2003) introducerede bitskiftoperatører (<< og >>), men ingen generel måde at manipulere individuelle bits er tilgængelig. Bit operationer kan være meget nyttig. For eksempel er dit program muligvis nødt til at interface med et andet system, der kræver bitmanipulation. Men derudover er der en masse tricks, der kan udføres ved hjælp af individuelle bits. Denne artikel undersøger, hvad der kan gøres med bitmanipulation ved hjælp af VB.NET.

Du er nødt til at forstå bitvise operatører før noget andet. I VB.NET er disse:

  • Og
  • Eller
  • xor
  • Ikke

Bitvis betyder simpelthen, at operationerne kan udføres på to binære numre bit for bit. Microsoft bruger sandhedstabeller til at dokumentere bitvise handlinger. Sandhedstabellen for Og er:

1. bit 2. bit resultat
1 1 1
1 0 0
0 1 0
0 0 0

I min skole underviste de Karnaugh kort i stedet. Karnaugh-kortet for alle fire operationer er vist på nedenstående illustration.


Klik her for at vise illustrationen
Klik på knappen Tilbage i din browser for at vende tilbage

instagram viewer

Her er et simpelt eksempel ved hjælp af Og operation med to, fire bit binære tal:

Resultatet af 1100 Og 1010 er 1000.

Det er fordi 1 Og 1 er 1 (den første bit), og resten er 0.

Til at begynde med, lad os se på de bitoperationer, der er er direkte understøttet i VB.NET: lidt forskydning. Selvom både venstre skift og højre skift er tilgængelige, fungerer de på samme måde, så kun venstre skift vil blive diskuteret. Bitskift bruges ofte til kryptografi, billedbehandling og kommunikation.

VB.NETs bitskiftningsoperationer ...

  • Arbejd kun med de fire typer heltal: Byte, Kort, Heltal, og Lang
  • Er aritmetik skift operationer. Det betyder, at bits, der forskydes forbi slutningen af ​​resultatet, smides væk, og bitpositionerne, der er åbnet i den anden ende, er indstillet til nul. Alternativet kaldes cirkulær bitskift, og bitene, der forskydes forbi den ene ende, tilføjes simpelthen til den anden. VB.NET understøtter ikke cirkulær bitskift direkte. Hvis du har brug for det, bliver du nødt til at kode det på gammeldags måde: at multiplicere eller dele med 2.
  • Generer aldrig en undtagelse af overløb. VB.NET tager sig af eventuelle problemer, og jeg viser dig, hvad det betyder. Som nævnt kan du kode din egen bitskiftning ved at multiplicere eller dividere med 2, men hvis du bruger "kode din egen" tilgang, skal du teste for undtagelser fra overløb, der kan få dit program til krak.

En standard bitforskyvning ville se sådan ud:

Dim StartValue Som heltal = 14913080
Dim ValueAfterShifting som heltal
ValueAfterShifting = Startværdi << 50

Med ord tager denne operation den binære værdi 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 er den ækvivalente decimalværdi - vær opmærksom på, at det kun er en serie på 3 0'er og 3 1'er gentaget et par gange) og flytter den 50 pladser tilbage. Men da et heltal kun er 32 bit lang, er det meningsløst at skifte 50 pladser. VB.NET løser dette problem ved maskering skiftetællingen med en standardværdi, der svarer til den anvendte datatype. I dette tilfælde, ValueAfterShifting er en Heltal så det maksimale, der kan skiftes, er 32 bit. Standardmaskeværdien, der fungerer, er 31 decimaler eller 11111.

Masking betyder, at værdien i dette tilfælde 50 er Oged med masken. Dette giver det maksimale antal bits, der faktisk kan skiftes for den datatype.

I decimal:

50 og 31 er 18 - Det maksimale antal bits, der kan skiftes

Det giver faktisk mere mening i binært. De høje ordrebits, der ikke kan bruges til skifteoperationen, fjernes simpelthen væk.

110010 og 11111 er 10010

Når kodestykket udføres, er resultatet 954204160 eller binært 0011 1000 1110 0000 0000 0000 0000 0000. De 18 bit på venstre side af det første binære nummer forskydes, og de 14 bit på højre side forskydes til venstre.

Det andet store problem med at skifte bit er, hvad der sker, når antallet af steder at skifte er et negativt antal. Lad os bruge -50 som antallet af bit til at skifte og se, hvad der sker.

ValueAfterShifting = Startværdi << -50

Når dette kodestykke udføres, får vi -477233152 eller 1110 0011 1000 1110 0000 0000 0000 0000 i binær. Antallet er skiftet 14 pladser tilbage. Hvorfor 14? VB.NET antager, at antallet af steder er et usigneret heltal og gør et Og betjening med den samme maske (31 for heltal).

1111 1111 1111 1111 1111 1111 1100 1110
0000 0000 0000 0000 0000 0000 0001 1111
(Og)
0000 0000 0000 0000 0000 0000 0000 1110

1110 i binær er 14 decimaler. Bemærk, at dette er det modsatte af at skifte positive 50 pladser.

På næste side går vi videre til nogle andre bitoperationer, startende med Xor-kryptering!

Jeg nævnte, at en brug af bit-operationer er kryptering. Xor-kryptering er en populær og enkel måde at "kryptere" en fil på. I min artikel Very Simple Encryption ved hjælp af VB.NET viser jeg dig en bedre måde ved hjælp af strengmanipulation i stedet. Men Xor-kryptering er så almindelig, at den fortjener i det mindste at blive forklaret.

Kryptering af en tekststreng betyder at oversætte den til en anden tekststreng, der ikke har et indlysende forhold til den første. Du har også brug for en måde at dekryptere den igen. Xor-kryptering oversætter den binære ASCII-kode for hvert tegn i strengen til et andet tegn vha. Xor-operationen. For at gøre denne oversættelse skal du bruge et andet nummer til at bruge i Xor. Dette andet nummer kaldes nøglen.

Xor-kryptering kaldes en "symmetrisk algoritme". Dette betyder, at vi også kan bruge krypteringsnøglen som dekrypteringsnøgle.

Lad os bruge "A" som nøgle og kryptere ordet "Basic". ASCII-koden for "A" er:

0100 0001 (decimal 65)

ASCII-koden til Basic er:

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

Det xor af hver af disse er:

0000 0011 - decimal 3
0010 0000 - decimal 32
0011 0010 - decimal 50
0010 1000 - decimal 40
0010 0010 - decimal 34

Denne lille rutine gør susen:

- Xor-kryptering -
Dim i som kort
ResultString. Tekst = ""
Dim KeyChar som heltal
KeyChar = Asc (EncryptionKey. Tekst)
For i = 1 til Len (InputString. Tekst)
ResultString. Tekst & = _
Chr (KeyChar Xor _
Asc (Mid (InputString) Tekst, i, 1)))
Næste

Resultatet kan ses på denne illustration:


Klik her for at vise illustrationen
Klik på knappen Tilbage i din browser for at vende tilbage

For at vende krypteringen skal du bare kopiere og indsætte strengen fra Resultat TextBox tilbage i String TextBox og klikke på knappen igen.

Et andet eksempel på noget, du kan gøre med bitvise operatører, er at bytte to heltal uden at erklære en tredje variabel til midlertidig lagring. Dette er den slags ting, de plejede at gøre i sprogprogrammer til samling for mange år siden. Det er ikke for nyttigt nu, men du vinder muligvis en indsats en dag, hvis du kan finde nogen, der ikke tror, ​​at du kan gøre det. I alle tilfælde, hvis du stadig har spørgsmål om, hvordan xor fungerer, arbejder gennem dette skulle bringe dem til hvile. Her er koden:

Dim FirstInt som heltal
Dim SecondInt som heltal
FirstInt = CInt (FirstIntBox. Tekst)
SecondInt = CInt (SecondIntBox. Tekst)
FirstInt = FirstInt Xor SecondInt
SecondInt = FirstInt Xor SecondInt
FirstInt = FirstInt Xor SecondInt
ResultBox. Tekst = "Første heltal:" & _
FirstInt. ToString & "-" & _
"Andet heltal:" & _
SecondInt. toString

Og her er koden i handling:


Klik her for at vise illustrationen
Klik på knappen Tilbage i din browser for at vende tilbage

At finde ud af nøjagtigt, hvorfor dette fungerer, vil være "som en øvelse for den studerende".

På næste side når vi målet: Generel bitmanipulation

Selvom disse tricks er sjove og lærerige, er de stadig ingen erstatning for generel bitmanipulation. Hvis du virkelig kommer ned på niveauet for bits, er det, du ønsker, en måde at undersøge individuelle bits, indstille dem eller ændre dem. Det er den rigtige kode, der mangler fra .NET.

Grunden til, at det mangler, er måske, at det ikke er så svært at skrive underprogrammer, der opnår den samme ting.

En typisk grund til, at du måske ønsker at gøre dette, er at opretholde det, der undertiden kaldes a flag byte. Nogle applikationer, især dem, der er skrevet på sprog på lavt niveau, som assembler, opretholder otte boolske flag i en enkelt byte. For eksempel indeholder en 6502-processorchips statusregister disse oplysninger i en enkelt 8 bit-byte:

Bit 7. Negativt flag
Bit 6. Overstrømningsflag
Bit 5. Ubrugt
Bit 4. Break flag
Bit 3. Decimalt flag
Bit 2. Afbryd-deaktiver flag
Bit 1. Nul flag
Bit 0. Bær flag

(fra Wikipedia)

Hvis din kode skal arbejde med denne type data, har du brug for generel bitmanipulationskode. Denne kode gør jobbet!

'ClearBit Sub sletter den 1 baserede, niende bit
'(MyBit) af et heltal (MyByte).
Sub ClearBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
'Opret en bitmaske med 2 til nth power bit set:
BitMask = 2 ^ (MyBit - 1)
Ryd den niende bit:
MyByte = MyByte og ikke BitMask
Afslut under
'ExamineBit-funktionen returnerer sandt eller falsk
'afhængigt af værdien af ​​den 1 baserede, nth bit (MyBit)
'af et heltal (MyByte).
Funktion ExamineBit (ByVal MyByte, ByVal MyBit) som boolsk
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
ExamineBit = ((MyByte Og BitMask)> 0)
Slut Funktion
'SetBit Sub indstiller den 1 baserede, niende bit
'(MyBit) af et heltal (MyByte).
Sub SetBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte eller BitMask
Afslut under
'ToggleBit Sub ændrer tilstanden
'af den 1 baserede, niende bit (MyBit)
'af et heltal (MyByte).
Sub ToggleBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte Xor BitMask
Afslut under

For at demonstrere koden kalder denne rutine den (parametre, der ikke er kodet på Click Sub):

Privat sub ExBitCode_Click (...
Dim Byte1, Byte2 Som Byte
Dim MyByte, MyBit
Dim StatusOfBit Som boolsk
Dim valgtRB som streng
StatusLine. Tekst = ""
SelectedRB = GetCheckedRadioButton (Me) .navn
Byte1 = ByteNum. Tekst 'Nummer, der skal konverteres til Bit-flag
Byte2 = BitNum. Tekst 'Bit, der skal kobles til
'Følgende rydder byordenen med høj ordre og returnerer kun
'lav ordre byte:
MyByte = Byte1 Og & HFF
MyBit = Byte2
Vælg sag valgt RB
Sag "ClearBitButton"
ClearBit (MyByte, MyBit)
StatusLine. Tekst = "Ny byte:" & MyByte
Sag "ExamineBitButton"
StatusOfBit = ExamineBit (MyByte, MyBit)
StatusLine. Tekst = "Bit" & MyBit & _
"er" & StatusOfBit
Sag "SetBitButton"
SetBit (MyByte, MyBit)
StatusLine. Tekst = "Ny byte:" & MyByte
Sag "ToggleBitButton"
ToggleBit (MyByte, MyBit)
StatusLine. Tekst = "Ny byte:" & MyByte
Slut Vælg
Afslut under
Privat funktion GetCheckedRadioButton (_
ByVal Parent As Control) _
Som RadioButton
Dim FormControl As Control
Dim RB Som RadioButton
For hver FormControl In Parent. Controls
Hvis FormControl. GetType () Er GetType (RadioButton) derefter
RB = DirectCast (FormControl, RadioButton)
Hvis RB.Checked, returner derefter RB
Afslut Hvis
Næste
Intet tilbage
Slut Funktion

Koden i handling ser sådan ud:


Klik her for at vise illustrationen
Klik på knappen Tilbage i din browser for at vende tilbage

instagram story viewer