Bitové operácie vo VB.NET

VB.NET nepodporuje priamo bitové operácie. Framework 1.1 (VB.NET 2003) predstavil operátory bitového posunu (<< a >>), ale neexistuje žiadny všeobecný spôsob manipulácie s jednotlivými bitmi. Bitové operácie môcť byť veľmi užitočný. Váš program môže napríklad potrebovať rozhranie s iným systémom, ktorý vyžaduje bitovú manipuláciu. Ale okrem toho existuje veľa trikov, ktoré možno urobiť pomocou jednotlivých bitov. Tento článok sa venuje prieskumu toho, čo je možné urobiť pomocou bitovej manipulácie pomocou VB.NET.

Musíte to pochopiť bitové operátory pred čímkoľvek iným. Vo VB.NET to sú:

  • a
  • alebo
  • xor
  • nie

Bitové znamenie jednoducho znamená, že operácie je možné vykonávať na dvoch binárnych číslach po bitoch. Microsoft používa tabuľky pravdy dokumentovať bitové operácie. Pravda tabuľka pre a je:

1. bit 2. výsledok bitov
1 1 1
1 0 0
0 1 0
0 0 0

V mojej škole to učili Karnaugh namiesto toho mapy. Mapa Karnaugha pre všetky štyri operácie je znázornená na obrázku nižšie.


Kliknutím sem zobrazíte ilustráciu
Ak sa chcete vrátiť, kliknite v prehliadači na tlačidlo Späť

instagram viewer

Tu je jednoduchý príklad použitia a operácia s dvoma, štvorbitovými binárnymi číslami:

Výsledok 1100 a 1010 je 1 000.

To preto, že 1 a 1 je 1 (prvý bit) a ostatné sú 0.

Na začiatok sa pozrime na bitové operácie, ktoré priamo podporované vo VB.NET: bit radenie. Aj keď sú k dispozícii ľavý aj pravý posun, fungujú rovnako, takže sa bude diskutovať iba o ľavom posunutí. Bitový posun sa najčastejšie používa v kryptografii, spracovaní obrazu a komunikácii.

Operácie bitového posunu VB.NET ...

  • Pracujte iba so štyrmi typmi celých čísel: byte, Krátky, celé čísloa dlho
  • aritmetika prevodové operácie. To znamená, že bity posunuté za koniec výsledku sa vyhodia a bitové pozície otvorené na druhom konci sa nastavia na nulu. Alternatíva sa nazýva kruhové posúvanie bitov a bity posunuté za jeden koniec sa jednoducho pripočítajú na druhý. VB.NET priamo nepodporuje kruhové bitové posúvanie. Ak to potrebujete, musíte ho kódovať staromódnym spôsobom: vynásobením alebo delením 2.
  • Nikdy nevytvárajte výnimku pretečenia. VB.NET sa postará o všetky možné problémy a ukážem vám, čo to znamená. Ako už bolo uvedené, môžete vlastné kódovanie bitov kódovať vynásobením alebo delením 2, ale ak použijete „kódujte svoj vlastný“ prístup, musíte otestovať výnimky z pretečenia, ktoré môžu spôsobiť, že váš program bude fungovať zlyhanie.

Štandardná operácia presunu bitov bude vyzerať asi takto:

Dim StartingValue As Integer = 14913080
Dim ValueAfterShifting As Integer
ValueAfterShifting = StartingValue << 50

Inými slovami, táto operácia berie binárnu hodnotu 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 je ekvivalentná desatinná hodnota - všimnite si, že je to len zopakovanie série 3 0 a 3 1) a posúva ju o 50 miest ďalej. Ale pretože celé číslo má dĺžku iba 32 bitov, presunutie 50 miest nemá význam. VB.NET rieši tento problém pomocou maskovanie počet posunov so štandardnou hodnotou, ktorá zodpovedá použitému typu údajov. V tomto prípade, ValueAfterShifting je celé číslo maximum, ktoré je možné posunúť, je 32 bitov. Štandardná hodnota masky, ktorá funguje, je 31 desatinných miest alebo 11111.

maskovanie znamená, že hodnota, v tomto prípade 50, je aed s maskou. Toto poskytuje maximálny počet bitov, ktoré sa môžu skutočne posunúť pre daný typ údajov.

V desiatkovej sústave:

50 a 31 je 18 - Maximálny počet bitov, ktoré je možné posúvať

V skutočnosti to dáva väčší zmysel v binárnom formáte. Bity vysokého rádu, ktoré nemožno použiť na operáciu radenia, sa jednoducho odizolujú.

110010 a 11111 je 10010

Po vykonaní útržku kódu je výsledkom 954204160 alebo, binárne, 0011 1000 1110 0000 0000 0000 0000 0000. 18 bitov na ľavej strane prvého binárneho čísla sa posunie preč a 14 bitov na pravej strane sa posunie doľava.

Ďalším veľkým problémom pri posúvaní bitov je to, čo sa stane, keď je počet miest na posun záporný. Použime -50 ako počet bitov na posun a uvidíme, čo sa stane.

ValueAfterShifting = StartingValue << -50

Po vykonaní tohto útržku kódu získame binárne číslo -477233152 alebo 1110 0011 1000 1110 0000 0000 0000 0000. Počet sa posunul o 14 miest. Prečo 14? VB.NET predpokladá, že počet miest je celé číslo bez znamienka a robí a operácia s rovnakou maskou (31 pre celé čísla).

1111 1111 1111 1111 1111 1111 1100 1110
0000 0000 0000 0000 0000 0000 0001 1111
(A)
0000 0000 0000 0000 0000 0000 0000 1110

1110 v binárnom formáte je 14 desatinných miest. Všimnite si, že toto je opak posunu pozitívnych 50 miest.

Na ďalšej stránke sa presunieme k iným bitovým operáciám, počínajúc Xor Encryption!

Spomenul som, že jedným použitím bitových operácií je šifrovanie. Šifrovanie Xor je populárny a jednoduchý spôsob „šifrovania“ súboru. V mojom článku Veľmi jednoduché šifrovanie pomocou VB.NET vám ukážem lepší spôsob použitia reťazcovej manipulácie. Šifrovanie Xor je však také bežné, že si zaslúži aspoň vysvetlenie.

Šifrovanie textového reťazca znamená jeho preklad do iného textového reťazca, ktorý nemá zjavný vzťah k prvému. Potrebujete tiež spôsob, ako ho znova dešifrovať. Šifrovanie Xor prevádza binárny kód ASCII pre každý znak v reťazci na iný znak pomocou operácie Xor. Na vykonanie tohto prekladu potrebujete v Xore ďalšie číslo. Toto druhé číslo sa nazýva kľúč.

Šifrovanie X alebo sa nazýva „symetrický algoritmus“. To znamená, že šifrovací kľúč môžeme použiť aj ako dešifrovací kľúč.

Ako kľúč použijeme písmeno A a zašifrujeme slovo „Základné“. ASCII kód ​​pre „A“ je:

0100 0001 (desatinné 65)

ASCII kód ​​pre Basic je:

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

xor z každého z nich je:

0000 0011 - desatinné miesto 3
0010 0000 - desatinné miesto 32
0011 0010 - desatinné miesto 50
0010 1000 - desatinné miesto 40
0010 0010 - desatinné miesto 34

Táto malá rutina robí tento trik:

- Xor Encryption -
Dim i as Short
ResultString. Text = ""
Dim KeyChar ako celé číslo
KeyChar = Asc (EncryptionKey. Text)
Pre i = 1 na len (InputString. Text)
ResultString. Text & = _
Chr (KeyChar X alebo _
Asc (Mid (InputString. Text, i, 1)))
Ďalšie

Výsledok vidno na tejto ilustrácii:


Kliknutím sem zobrazíte ilustráciu
Ak sa chcete vrátiť, kliknite v prehliadači na tlačidlo Späť

Ak chcete šifrovanie zvrátiť, skopírujte a prilepte reťazec z textového poľa Výsledok späť do textového poľa String TextBox a znova kliknite na tlačidlo.

Ďalším príkladom niečoho, čo môžete urobiť s bitovými operátormi, je výmena dvoch celých čísel bez deklarovania tretej premennej za dočasné úložisko. Toto je to, čo robili pred rokmi v programoch zostavovania jazykov. Teraz to nie je príliš užitočné, ale raz môžete vyhrať stávku, ak nájdete niekoho, kto neverí, že to dokážete. V každom prípade, ak máte ďalšie otázky, ako na to xor práce, prostredníctvom ktorých by ich mali dať k odpočinku. Tu je kód:

Dim FirstInt As Integer
Dim SecondInt As Integer
FirstInt = CInt (FirstIntBox. Text)
SecondInt = CInt (SecondIntBox. Text)
FirstInt = FirstInt Xor SecondInt
SecondInt = FirstInt X alebo SecondInt
FirstInt = FirstInt Xor SecondInt
ResultBox. Text = "First Integer:" & _
FirstInt. Natiahnuť & " - " & _
„Second Integer:“ & _
SecondInt. Natiahnuť

A tu je kód v akcii:


Kliknutím sem zobrazíte ilustráciu
Ak sa chcete vrátiť, kliknite v prehliadači na tlačidlo Späť

Presne zistiť, prečo to bude fungovať ako "ako cvičenie pre študenta".

Na ďalšej stránke sa dostávame k cieľu: Všeobecné bitové manipulácie

Aj keď sú tieto triky zábavné a vzdelávacie, stále nenahrádzajú všeobecnú bitovú manipuláciu. Ak sa skutočne dostanete na úroveň bitov, je to spôsob, ako preskúmať jednotlivé bity, nastaviť ich alebo zmeniť. To je skutočný kód, ktorý v .NET chýba.

Možno dôvod, prečo to chýba, je, že nie je také ťažké písať podprogramy, ktoré vykonávajú to isté.

Typickým dôvodom, prečo by ste to mohli urobiť, je zachovať to, čo sa niekedy nazýva bajt vlajky. Niektoré aplikácie, najmä tie, ktoré sú napísané v jazykoch nízkej úrovne, napríklad assembler, si budú udržiavať osem booleovských vlajok v jednom bajte. Napríklad stavový register procesora s procesorom 6502 uchováva tieto informácie v jednom 8 bitovom bajte:

Bit 7. Záporná vlajka
Bit 6. Vlajka pretečenia
Bit 5. nepoužívaný
Bit 4. Prerušiť vlajku
Bit 3. Desatinná vlajka
Bit 2. Príznak prerušenia
Bit 1. Nulová vlajka
Bit 0. Prenášať vlajku

(z Wikipédie)

Ak váš kód musí pracovať s takýmito údajmi, potrebujete kód na manipuláciu s bitmi na všeobecné použitie. Tento kód urobí svoju prácu!

'ClearBit Sub vymaže 1-tý, deviaty bit
'(MyBit) z celého čísla (MyByte).
Sub ClearBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
„Vytvorte bitovú masku so sadou bitov od 2 do n-tej:
BitMask = 2 ^ (MyBit - 1)
„Vymažte deviaty bit:
MyByte = MyByte a nie BitMask
End Sub
'Funkcia ExamineBit vráti hodnotu True alebo False
'v závislosti na hodnote n-tého bitu (MyBit) založeného na 1
'z celého čísla (MyByte).
Funkcia ExamineBit (ByVal MyByte, ByVal MyBit) Ako boolean
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
ExamineBit = ((MyByte And BitMask)> 0)
Ukončenie funkcie
„SetBit Sub nastaví n-tý bit na základe 1
'(MyBit) z celého čísla (MyByte).
Sub SetBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte alebo BitMask
End Sub
„Prepínač ToggleBit zmení stav
'z 1, deviateho bitu (MyBit)
'z celého čísla (MyByte).
Sub ToggleBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte Xor BitMask
End Sub

Na demonštráciu kódu ho táto rutina nazýva (parametre nekódované v Click Sub):

Súkromná čiastková ExBitCode_Click (...
Dim Byte1, Byte2 As Byte
Dim MyByte, MyBit
Dim StatusOfBit As Boolean
Dim SelectedRB ako String
StatusLine. Text = ""
SelectedRB = GetCheckedRadioButton (Me) .Name
Byte1 = ByteNum. Text 'Číslo, ktoré sa má previesť na bitové príznaky
Byte2 = BitNum. Text 'Bit sa má prepnúť
'Nasledujúci vymaže bajt vysokej úrovne a vráti iba
'bajt nízkeho poradia:
MyByte = Byte1 And & HFF
MyBit = Byte2
Vyberte možnosť Case SelectedRB
Prípad „ClearBitButton“
ClearBit (MyByte, MyBit)
StatusLine. Text = "New Byte:" & MyByte
Prípad „ExamineBitButton“
StatusOfBit = ExamineBit (MyByte, MyBit)
StatusLine. Text = "Bit" & MyBit & _
„je“ a StatusOfBit
Prípad "SetBitButton"
SetBit (MyByte, MyBit)
StatusLine. Text = "New Byte:" & MyByte
Prípad "ToggleBitButton"
ToggleBit (MyByte, MyBit)
StatusLine. Text = "New Byte:" & MyByte
Ukončiť výber
End Sub
Súkromná funkcia GetCheckedRadioButton (_
ByVal rodič ako kontrola) _
Ako RadioButton
Dim FormControl ako kontrola
Dim RB ako RadioButton
Pre každý formulárControl v rodiči. riadenie
Ak FormControl. GetType () je potom GetType (RadioButton)
RB = DirectCast (FormControl, RadioButton)
Ak je RB.Kontrola, potom vráťte RB
Koniec Ak
Ďalšie
Návrat Nič
Ukončenie funkcie

Kód v akcii vyzerá takto:


Kliknutím sem zobrazíte ilustráciu
Ak sa chcete vrátiť, kliknite v prehliadači na tlačidlo Späť

instagram story viewer