VB.NET ne podpira operacij na ravni bitja neposredno. Okvir 1.1 (VB.NET 2003) je predstavil operaterje premikov bitov (<< in >>), vendar ni na voljo splošnega načina manipulacije posameznih bitov. Bitne operacije lahko bodi zelo uporaben. Na primer, vaš program bi moral imeti vmesnik z drugim sistemom, ki zahteva bit manipulacije. Toda poleg tega obstaja veliko trikov, ki jih je mogoče izvesti s pomočjo posameznih bitov. Ta članek raziskuje, kaj je mogoče storiti z manipulacijo z bitmi z uporabo VB.NET.
Morate razumeti bitni operaterji pred čim drugim. V VB.NET so to:
- In
- Or
- Xor
- Ne
Bitno preprosto pomeni, da se lahko operacije izvajajo na dveh binarnih številkah po bit. Microsoft uporablja tabele resnice za dokumentiranje bitnih operacij. Tabela resnice za In je:
1. bit 2. rezultat
1 1 1
1 0 0
0 1 0
0 0 0
V moji šoli so poučevali Karnaugh karte namesto tega. Karnaugh-ov zemljevid za vse štiri operacije je prikazan na spodnji sliki.
Kliknite tukaj, če želite prikazati ilustracijo
Za vrnitev kliknite gumb Nazaj v brskalniku
Tu je preprost primer z uporabo In delovanje z dvema, štirimi bitnimi binarnimi številkami:
Rezultat 1100 In 1010 je 1000.
To je zato, ker 1 In 1 je 1 (prvi bit), ostali pa 0.
Za začetek si oglejmo bitne operacije, ki so so neposredno podprto v VB.NET: malo premik. Čeprav sta na voljo tako premik levo kot desno, delujeta enako, tako da se bo obravnavalo le levo premik. Premikanje bitov se najpogosteje uporablja v kriptografiji, obdelavi slike in komunikaciji.
Operacije premika VB.NET-a ...
- Delajte samo s štirimi vrstami celih števil: Bajta, Kratek, Integer, in dolga
- Ali so aritmetika operacije premikanja. To pomeni, da se bitovi, premaknjeni proti koncu rezultata, vržejo na stran, bitni položaji, odprti na drugem koncu, pa se postavijo na nič. Druga možnost se imenuje krožno pomikanje bitov, bitovi, pomaknjeni mimo enega konca, se preprosto dodajo na drugega. VB.NET ne podpira neposredno krožnega premikanja bitov. Če ga potrebujete, ga boste morali kodirati po staromodnem načinu: množenje ali deljenje z 2.
- Nikoli ne ustvarite izjeme za prelivanje. VB.NET skrbi za morebitne težave in pokazal vam bom, kaj to pomeni. Kot je navedeno, lahko premik bitja kodirate tako, da pomnožite ali delite z 2, če pa uporabite "kodirajte svoj pristop", morate preizkusiti, ali obstajajo izjemne razlike, ki lahko povzročijo vaš program zrušiti.
Standardna operacija premikanja bitov bi izgledala nekako takole:
Dim StartingValue kot celo število = 14913080
Dim ValueAfterShifting kot celoten
ValueAfterShifting = StartingValue << 50
Z besedami, ta operacija prevzame binarno vrednost 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 je enakovredna decimalna vrednost - upoštevajte, da gre le za serijo 3 0 in 3 1, ki se nekajkrat ponovi) in jo premakne za 50 mest. Ker pa je Integer dolg le 32 bitov, je njegovo premikanje na 50 mest nesmiselno. VB.NET to težavo rešuje maskiranje štetje premika s standardno vrednostjo, ki ustreza vrsti podatkov, ki se uporablja. V tem primeru, ValueAfterShifting je Integer tako da je največji premik 32 bitov. Standardna vrednost maske, ki deluje, je 31 decimalnih ali 11111.
Maskiranje pomeni, da je vrednost v tem primeru 50 Ined z masko. Tako dobite največje število bitov, ki jih je dejansko mogoče premakniti za to vrsto podatkov.
V decimalki:
50 in 31 je 18 - največje število bitov, ki jih je mogoče premakniti
Pravzaprav je bolj smiselno v binarni obliki. Bitovi visokega reda, ki jih ni mogoče uporabiti za premikanje, preprosto odvzamejo.
110010 In 11111 je 10010
Ko je delček kode izveden, je rezultat 954204160 ali, dvojiško, 0011 1000 1110 0000 0000 0000 0000 0000. 18 bitov na levi strani prvega binarnega števila se premakne in 14 bitov na desni strani se premakne v levo.
Druga velika težava s premikanjem bitov je tisto, kar se zgodi, ko je število mest, ki jih je treba zamenjati, negativno število. Izkoristimo –50 kot število bitov za premik in poglejmo, kaj se zgodi.
ValueAfterShifting = StartingValue << -50
Ko se izvede ta delček kode, dobimo -477233152 ali 1110 0011 1000 1110 0000 0000 0000 0000 v dvojiškem formatu. Število je premaknjeno za 14 mest. Zakaj 14? VB.NET predpostavlja, da je število mest nepodpisano celo število in ne In delovanje z isto masko (31 za Integers).
1111 1111 1111 1111 1111 1111 1100 1110
0000 0000 0000 0000 0000 0000 0001 1111
(In)
0000 0000 0000 0000 0000 0000 0000 1110
1110 v binarni obliki je 14 decimalnih mest. Opazite, da gre za obratno spremembo pozitivnih 50 mest.
Na naslednji strani preidemo na nekatere druge bitne operacije, začenši z Xor šifriranje!
Omenil sem, da je ena uporaba bitnih operacij šifriranje. Xor šifriranje je priljubljen in preprost način za "šifriranje" datoteke. V svojem članku Zelo enostavno šifriranje z uporabo VB.NET-a vam pokažem boljši način z uporabo manipulacije z vrvicami. Toda šifriranje Xorja je tako pogosto, da si ga zasluži vsaj razložiti.
Šifriranje besedilnega niza pomeni prevajanje v drug besedilni niz, ki nima očitnega odnosa do prvega. Potrebujete tudi način, da ga ponovno dešifrirate. Šifriranje Xor pretvori binarno kodo ASCII za vsak znak v nizu v drug znak s pomočjo operacije Xor. Če želite narediti ta prevod, morate v Xorju uporabiti še eno številko. To drugo številko imenujemo ključna.
Šifriranje Xor se imenuje "simetrični algoritem". To pomeni, da lahko šifrirni ključ uporabimo tudi kot ključ za dešifriranje.
Kot ključ uporabimo "A" in šifriramo besedo "Basic". Koda ASCII za "A" je:
0100 0001 (decimalna številka 65)
Koda ASCII za Basic je:
B - 0100 0010
a - 0110 0001
s - 0111 0011
i - 0110 1001
c - 0110 0011
The Xor od tega je:
0000 0011 - decimalka 3
0010 0000 - decimalna 32
0011 0010 - decimalna 50
0010 1000 - decimalna 40
0010 0010 - decimalna 34
Ta mala rutina naredi trik:
- Xor šifriranje -
Dim i Kot kratek
ResultString. Besedilo = ""
Dim KeyChar kot celoten
KeyChar = Asc (EncryptionKey). Besedilo)
Za i = 1 do Len (InputString Besedilo)
ResultString. Besedilo & = _
Chr (KeyChar Xor _
Asc (sredina (InputString) Besedilo, i, 1)))
Naslednji
Rezultat lahko vidimo na tej sliki:
Kliknite tukaj, če želite prikazati ilustracijo
Za vrnitev kliknite gumb Nazaj v brskalniku
Če želite razveljaviti šifriranje, preprosto kopirajte in prilepite vrstico z Result TextBox nazaj v String TextBox in znova kliknite gumb.
Drug primer nečesa, kar lahko naredite pri bitnih operaterjih, je zamenjava dveh celih števil, ne da bi za začasno shranjevanje razglasili tretjo spremenljivko. To je vrsta stvari, ki so jo pred leti delali v jezikovnih programih montaže. Zdaj to ni preveč koristno, vendar lahko kakšen dan dobite stavo, če najdete nekoga, ki ne verjame, da lahko to storite. Vsekakor, če imate še vprašanja o tem, kako Xor dela, s pomočjo tega bi morali počivati. Tu je koda:
Zatemni kot prvi
Dim SecondInt kot celoten
FirstInt = CInt (FirstIntBox. Besedilo)
SecondInt = CInt (SecondIntBox. Besedilo)
FirstInt = FirstInt Xor SecondInt
SecondInt = FirstInt Xor SecondInt
FirstInt = FirstInt Xor SecondInt
ResultBox. Text = "Prvi celoštevec:" & _
Najprej. ToString & "-" & _
"Drugi celoten:" & _
SecondInt. ToString
In tu je koda v akciji:
Kliknite tukaj, če želite prikazati ilustracijo
Za vrnitev kliknite gumb Nazaj v brskalniku
Ugotoviti, zakaj natančno to deluje, bo ostalo kot "vaja za študenta".
Na naslednji strani pridemo do cilja: Splošna manipulacija bitja
Čeprav so ti triki zabavni in poučni, še vedno niso nadomestilo za splošno manipulacijo z bitji. Če se resnično spustite na nivo bitov, je tisto, kar želite, preučiti posamezne bite, jih nastaviti ali spremeniti. To je prava koda, ki v .NET-u manjka.
Mogoče je razlog, da manjka, ta, da ni tako težko napisati podprogramov, ki dosežejo isto stvar.
Tipičen razlog, da bi to morda želeli, je ohranitev tega, kar se včasih imenuje a bajt zastave. Nekatere aplikacije, zlasti tiste, napisane v jezikih nizkega nivoja, kot je monter, bodo v enem bajtu ohranile osem logičnih zastavic. Na primer, v registru stanja čip 6502 procesorjev so te informacije v enem 8-bitnem bajtu:
Bit 7. Negativna zastava
Bit 6. Prelivna zastava
Bit 5 Neuporabljen
Bit 4. Razbiti zastavo
Bit 3. Decimalna zastava
Bit 2. Prekinja-onemogoči zastavo
Bit 1. Zero zastava
Bit 0. Nosite zastavo
(iz Wikipedije)
Če mora vaša koda delovati s tovrstnimi podatki, potrebujete kodo splošne namene za manipulacijo z bitji. Ta koda bo opravila svoje delo!
'Subtitor ClearBit počisti 1, n-tem bit
'(MyBit) celega števila (MyByte).
Sub ClearBit (ByRef MyByte, ByVal MyBit)
Zatemnite BitMask kot Int16
'Ustvarite bitmonsko masko z nastavljenim bitumom od 2 do n:
BitMask = 2 ^ (MyBit - 1)
'Počistite niti bit:
MyByte = MyByte in ne BitMask
Končni pod
'Funkcija ExamineBit bo vrnila True ali False
"odvisno od vrednosti 1 -tega, n-bitnega (MyBit)
'celega števila (MyByte).
Funkcija ExamineBit (ByVal MyByte, ByVal MyBit) Kot Boolean
Zatemnite BitMask kot Int16
BitMask = 2 ^ (MyBit - 1)
ExamineBit = ((MyByte in BitMask)> 0)
Končna funkcija
'SubB SetBit bo nastavil 1. nth bit
'(MyBit) celega števila (MyByte).
Pod SetBit (ByRef MyByte, ByVal MyBit)
Zatemnite BitMask kot Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte ali BitMask
Končni pod
"Podoknica ToggleBit bo spremenila stanje
'od 1, ki temelji, nth bit (MyBit)
'celega števila (MyByte).
Sub ToggleBit (ByRef MyByte, ByVal MyBit)
Zatemnite BitMask kot Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte Xor BitMask
Končni pod
Za prikaz kode ga pokliče ta rutina (parametri niso kodirani na klik Sub):
Zasebni Sub ExBitCode_Click (...
Dim Byte1, Byte2 Kot Byte
Dim MyByte, MyBit
Zatemnjen statusOfBit kot boolean
Zatemnjen izbranRB kot niz
StatusLine Besedilo = ""
IzbranoRB = GetCheckedRadioButton (Me) .Name
Byte1 = ByteNum. Besedilo 'Številka, ki jo je treba pretvoriti v bitne zastave
Byte2 = BitNum. Besedilo „Bit, ki ga je treba preklopiti
"Naslednje počisti bajt visokega reda in vrne samo
'bajt nizkega reda:
MyByte = bajt1 in & HFF
MyBit = bajt2
Izberite Primer izbranegaRB
Ohišje "ClearBitButton"
ClearBit (MyByte, MyBit)
StatusLine Text = "Nov bajt:" & MyByte
Primer "ExamineBitButton"
StatusOfBit = ExamineBit (MyByte, MyBit)
StatusLine Text = "Bit" in MyBit & _
"je" & StatusOfBit
Ohišje "SetBitButton"
SetBit (MyByte, MyBit)
StatusLine Text = "Nov bajt:" & MyByte
Primer "ToggleBitButton"
ToggleBit (MyByte, MyBit)
StatusLine Text = "Nov bajt:" & MyByte
Izberite konec
Končni pod
Zasebna funkcija GetCheckedRadioButton (_
ByVal starš kot nadzor) _
Kot RadioButton
Zatemnite FormControl kot nadzor
Dim RB kot RadioButton
Za vsako matično formulo ControlControl. Kontrole
Če FormControl. GetType () je GetType (RadioButton) Potem
RB = DirectCast (FormControl, RadioButton)
Če je RB preverjeno, vrnite RB
Konec Če
Naslednji
Vrni nič
Končna funkcija
Dejavna koda izgleda tako:
Kliknite tukaj, če želite prikazati ilustracijo
Za vrnitev kliknite gumb Nazaj v brskalniku