„Bitwise“ operacijos VB.NET

VB.NET tiesiogiai nepalaiko bitų lygio operacijų. „Framework 1.1“ (VB.NET 2003) pristatė bitų keitimo operatorius (<< ir >>), tačiau nėra jokio bendro tikslo būdo, kaip manipuliuoti atskirais bitais. Bitinės operacijos gali būti labai naudinga. Pvz., Jūsų programai gali reikėti sąsajos su kita sistema, kuriai reikia truputį manipuliuoti. Bet be to, yra daugybė triukų, kuriuos galima padaryti naudojant atskirus bitus. Šiame straipsnyje apžvelgiama, ką galima padaryti manipuliuojant bitomis naudojant VB.NET.

Jūs turite suprasti bitų operatoriai prieš ką nors kita. VB.NET, tai yra:

  • Ir
  • Arba
  • Xor
  • Ne

„Bitwise“ reiškia tiesiog, kad operacijas galima atlikti dviem dvejetainiais skaičiais po vieną. „Microsoft“ naudoja tiesos lentelės dokumentuoti bitų operacijas. Tiesos lentelė Ir yra:

1 bitų 2 bitų rezultatas
1 1 1
1 0 0
0 1 0
0 0 0

Mano mokykloje jie mokė Karnaugh vietoj žemėlapių. Visų keturių Karnaugh žemėlapis parodytas paveikslėlyje žemiau.


Spustelėkite čia, norėdami pamatyti iliustraciją
Norėdami grįžti, spustelėkite naršyklės mygtuką Atgal

instagram viewer

Štai paprastas pavyzdys naudojant Ir operacija dviem, keturiais bitų dvejetainiais skaičiais:

Rezultatas 1100 Ir 1010 yra 1000.

Taip yra todėl, kad 1 Ir 1 yra 1 (pirmasis bitas), o kiti yra 0.

Pirmiausia pažvelkime į tai, kurios operacijos atliekamos yra tiesiogiai palaikoma VB.NET: šiek tiek pasislenka. Nors yra ir kairės, ir dešinės pamainos, jos veikia vienodai, todėl bus kalbama tik apie kairę. Bitų perkėlimas dažniausiai naudojamas kriptografijoje, vaizdo apdorojime ir ryšiuose.

VB.NET truputį keičiamos operacijos ...

  • Dirbkite tik su keturių tipų sveikaisiais skaičiais: Baitas, Trumpas, Sveikasis skaičiusir Ilgai
  • Yra aritmetika pamaininės operacijos. Tai reiškia, kad bitai, pasislinkę už rezultato galo, yra išmetami, o kitame gale atidarytos bitų padėtys yra nulinės. Alternatyva vadinama žiediniu bitų poslinkiu, o bitai, pasislinkę per vieną galą, tiesiog pridedami prie kito. VB.NET nepalaiko tiesioginio apskrito bitų perkėlimo. Jei jums to reikia, turėsite tai užkoduoti senamadišku būdu: padauginti arba padalyti iš 2.
  • Niekada nesudarykite perpildymo išimties. VB.NET rūpinasi bet kokiomis galimomis problemomis ir aš jums parodysiu, ką tai reiškia. Kaip pažymėta, galite užkoduoti savo bitų perkėlimą padaugindami arba padalydami iš 2, bet jei naudojate „koduokite savo“ požiūrį, turite patikrinti, ar nėra perpildymo išimčių, kurios gali sukelti jūsų programą avarija.

Standartinė bitų perjungimo operacija atrodytų maždaug taip:

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

Žodžiu, ši operacija įgauna dvejetainę reikšmę 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 yra lygiavertė dešimtainė reikšmė - atminkite, kad tai tik 3 0 ir 3 1 eilutė, pakartojama keletą kartų) ir perkelkite ją į 50 vietų į kairę. Bet kadangi sveikasis skaičius yra tik 32 bitai, jo perkelti į 50 vietų yra beprasmiška. VB.NET šią problemą išsprendžia maskavimas pamainų skaičius su standartine verte, atitinkančia naudojamą duomenų tipą. Tokiu atveju, „ValueAfterShifting“ yra Sveikasis skaičius taigi maksimalus poslinkis yra 32 bitai. Standartinė kaukės vertė, kuri veikia, yra 31 dešimtainė arba 11111.

Maskavimas reiškia, kad vertė, šiuo atveju 50, yra Ired su kauke. Tai rodo maksimalų bitų skaičių, kurį iš tikrųjų galima perkelti tam duomenų tipui.

Po kablelio:

50 Ir 31 yra 18 - Maksimalus bitų, kuriuos galima perkelti, skaičius

Iš tikrųjų dvejetainis yra prasmingesnis. Aukštos eilės bitai, kurie negali būti naudojami perjungimo operacijai, paprasčiausiai pašalinami.

110010 ir 11111 yra 10010

Kai vykdomas kodo fragmentas, rezultatas yra 954204160 arba, dvejetainiu būdu, 0011 1000 1110 0000 0000 0000 0000 0000. 18 bitų, esančių pirmojo dvejetainio skaičiaus kairėje pusėje, yra atitraukti, o 14 bitų dešinėje - paslinkti į kairę.

Kita didelė su perkeliamaisiais bitais susijusi problema yra tai, kas nutinka, kai vietų, kurias reikia perkelti, skaičius yra neigiamas. Panaudokime -50 kaip bitų skaičių, kad pamatytume ir kas atsitiks.

ValueAfterShifting = StartingValue << -50

Kai vykdomas šis kodo fragmentas, dvejetainiu būdu gauname -477233152 arba 1110 0011 1000 1110 0000 0000 0000 0000. Skaičius buvo perkeltas į 14 vietų. Kodėl 14? VB.NET daro prielaidą, kad vietų skaičius yra neparašytas sveikasis skaičius, ir daro Ir operacija su ta pačia kauke (31 - sveikiesiems).

1111 1111 1111 1111 1111 1111 1100 1110
0000 0000 0000 0000 0000 0000 0001 1111
(Ir)
0000 0000 0000 0000 0000 0000 0000 1110

1110, dvejetainis, yra 14 dešimtųjų tikslumu. Atminkite, kad tai yra atvirkštinė teigiamos 50 vietos poslinkio pusė.

Kitame puslapyje pereiname prie kitų bitų operacijų, pradedant nuo „Xor“ šifravimas!

Aš minėjau, kad vienas bitų operacijų panaudojimas yra šifravimas. „Xor“ šifravimas yra populiarus ir paprastas būdas „užšifruoti“ failą. Savo straipsnyje „Labai paprastas šifravimas naudojant VB.NET“ parodysiu jums geresnį būdą, kaip manipuliuoti eilutėmis. Tačiau „Xor“ šifravimas yra toks įprastas, kad jis vertas bent jau būti paaiškintas.

Šifruoti teksto eilutę reiškia išversti ją į kitą teksto eilutę, kuri neturi akivaizdaus ryšio su pirmąja. Jums taip pat reikia būdo, kaip jį dar kartą iššifruoti. „Xor“ šifravimas paverčia dvejetainį ASCII kodą kiekvienam eilutės simboliui į kitą simbolį, naudojant „Xor“ operaciją. Norint atlikti šį vertimą, reikia dar vieno numerio, kurį galėtumėte naudoti „Xor“. Šis antrasis numeris vadinamas raktu.

„Xor“ šifravimas vadinamas „simetriniu algoritmu“. Tai reiškia, kad šifravimo raktą galime naudoti ir kaip iššifravimo raktą.

Panaudokime „A“ kaip raktą ir užšifruokime žodį „Basic“. ASCII kodas „A“ yra:

0100 0001 (dešimtainė 65)

„Basic“ ASCII kodas yra:

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

Xor kiekviena iš jų yra:

0000 0011 - 3 dešimtosios dalies
0010 0000 - 32 dešimtainis
0011 0010 - 50 dešimtųjų
0010 1000 - 40 ženklų po kablelio
0010 0010 - 34 dešimtainis

Ši maža rutina daro apgaulę:

- „Xor“ šifravimas -
Dim i as trumpas
Rezultatų styga. Tekstas = ""
Dim KeyChar kaip sveikasis skaičius
KeyChar = Asc (šifravimo raktas. Tekstas)
I = 1 - Len (InputString. Tekstas)
Rezultatų styga. Tekstas & = _
Chr („KeyChar Xor“ _
Asc (viduryje („InputString“). Tekstas, i, 1)))
Kitas

Rezultatą galima pamatyti šioje iliustracijoje:


Spustelėkite čia, norėdami pamatyti iliustraciją
Norėdami grįžti, spustelėkite naršyklės mygtuką Atgal

Norėdami pakeisti šifravimą, tiesiog nukopijuokite ir įklijuokite eilutę iš „Rezultatų teksto dėžutės“ atgal į teksto teksto dėžutę ir dar kartą spustelėkite mygtuką.

Kitas pavyzdys, ką galite padaryti naudodamiesi bitų operatoriais, yra apsikeisti dviem sveikaisiais skaičiais, nedeklaruodami trečiojo kintamojo laikinajam saugojimui. Tai yra dalykas, kurį jie prieš daugelį metų darydavo asamblėjos kalbų programose. Dabar tai nėra labai naudinga, bet kažkada gali laimėti lažybas, jei surasi žmogų, kuris netiki, kad gali tai padaryti. Bet kokiu atveju, jei vis dar kyla klausimų, kaip Xor darbai, dirbdami per tai turėtų priversti juos pailsėti. Štai kodas:

„Dim FirstInt as Integer“
Dim SecondInt kaip sveikasis skaičius
„FirstInt“ = CInt („FirstIntBox“. Tekstas)
„SecondInt“ = CInt („SecondIntBox“. Tekstas)
„FirstInt“ = „FirstInt Xor“ „SecondInt“
„SecondInt“ = „FirstInt Xor“ „SecondInt“
„FirstInt“ = „FirstInt Xor“ „SecondInt“
„Rezultatų dėžutė“. Tekstas = „Pirmasis sveikasis skaičius:“ ir _
„FirstInt“. „ToString“ ir „-“ & _
„Antrasis sveikasis skaičius:“ ir _
„SecondInt“. „ToString“

Ir štai kodas veikia:


Spustelėkite čia, norėdami pamatyti iliustraciją
Norėdami grįžti, spustelėkite naršyklės mygtuką Atgal

Tiksliai išsiaiškinęs, kodėl tai veikia, liks kaip „kaip užduotis studentui“.

Kitame puslapyje mes pasiekiame tikslą: Bendroji bitų manipuliacija

Nors šie triukai yra linksmi ir mokomieji, jie vis tiek nepakeičia bendro manipuliavimo bitų žiniomis. Jei jūs tikrai pasiekiate bitų lygį, ko norite, yra būdas ištirti atskirus bitus, juos nustatyti arba pakeisti. Tai yra tikrasis kodas, kurio trūksta .NET.

Galbūt to trūksta todėl, kad nėra taip sunku rašyti paprogrames, kurios įgyvendina tą patį dalyką.

Tipiška priežastis, kurią galite tai padaryti, yra išlaikyti tai, kas kartais vadinama a vėliavos baitas. Kai kurios programos, ypač parašytos žemo lygio kalbomis, tokiomis kaip surinkėjas, išlaikys aštuonias logines vėliavas viename baite. Pvz., 6502 procesoriaus lusto būsenos registras šią informaciją laiko vienu 8 bitų baitu:

7 bitai. Neigiama vėliava
6 bit. Perpildyta vėliava
5 bitai. Nenaudojamas
4 bit. Laužyti vėliavą
3 bitai. Dešimtainė vėliava
2 bitai. Pertraukti-išjungti vėliava
1 bit. Nulinė vėliava
0 bitų. Nešti vėliavą

(iš Vikipedijos)

Jei jūsų kodas turi veikti su tokio tipo duomenimis, jums reikalingas bendrosios paskirties bitų tvarkymo kodas. Šis kodas atliks darbą!

„ClearBit Sub“ išvalo 1-ąjį, n-ąjį bitą
„(„ MyBit “) sveikasis skaičius („ MyByte “).
Sub ClearBit („ByRef MyByte“, „ByVal MyBit“)
Dim BitMask As Int16
'Sukurkite bitkoiną naudodami 2–7 galios bitą:
„BitMask“ = 2 ^ („MyBit“ - 1)
„Išvalykite devintą bitą:
MyByte = MyByte, o ne „BitMask“
Pabaigos poskyris
„Funkcija„ ExamineBit “grįš teisinga arba klaidinga
priklausomai nuo 1-ojo bitų vertės („MyBit“)
sveikojo skaičiaus („MyByte“).
Funkcija „ExamineBit“ („ByVal MyByte“, „ByVal MyBit“) kaip loginė
Dim BitMask As Int16
„BitMask“ = 2 ^ („MyBit“ - 1)
„ExamineBit“ = ((„MyByte“ ir „BitMask“)> 0)
Pabaigos funkcija
„SetBit Sub“ nustatys 1-ąjį, n-ąjį bitą
„(„ MyBit “) sveikasis skaičius („ MyByte “).
„Sub SetBit“ („ByRef MyByte“, „ByVal MyBit“)
Dim BitMask As Int16
„BitMask“ = 2 ^ („MyBit“ - 1)
„MyByte“ = „MyByte“ arba „BitMask“
Pabaigos poskyris
„ToggleBit Sub“ pakeis būseną
'iš 1-ojo, n-ojo bitų („MyBit“)
sveikojo skaičiaus („MyByte“).
„Sub ToggleBit“ („ByRef MyByte“, „ByVal MyBit“)
Dim BitMask As Int16
„BitMask“ = 2 ^ („MyBit“ - 1)
„MyByte“ = „MyByte Xor BitMask“
Pabaigos poskyris

Norėdami parodyti kodą, ši rutina jį vadina (parametrai neužkoduoti „Click Sub“):

Privatus antrinis „ExBitCode_Click“ (...
„Dim Byte1“, „Byte2 As Aste“
Dim MyByte, MyBit
Dim StatusOfBit As Boolean
Dim SelectedRB As Styginių
„StatusLine“. Tekstas = ""
SelectedRB = GetCheckedRadioButton (Me) .Name
„Byte1“ = „ByteNum“. Tekstas 'skaičius, kuris turi būti konvertuotas į bitų vėliavas
„Byte2“ = „BitNum“. Tekstas „Truputis perjungiamas“
„Toliau išvalomas aukšto užsakymo baitas ir grąžinamas tik
'žemo užsakymo baitas:
MyByte = 1 baitas ir HFF
„MyBit“ = 2 baitas
Pasirinkite Case SelectedRB
Byla „ClearBitButton“
„ClearBit“ („MyByte“, „MyBit“)
„StatusLine“. Tekstas = „Naujas baitas:“ ir „MyByte“
Byla „ExamineBitButton“
StatusOfBit = ExamineBit („MyByte“, „MyBit“)
„StatusLine“. Tekstas = „Bit“ ir „MyBit“ ir _
„yra“ ir „StatusOfBit“
Byla „SetBitButton“
„SetBit“ („MyByte“, „MyBit“)
„StatusLine“. Tekstas = „Naujas baitas:“ ir „MyByte“
Byla „ToggleBitButton“
„ToggleBit“ („MyByte“, „MyBit“)
„StatusLine“. Tekstas = „Naujas baitas:“ ir „MyByte“
Pabaigos pasirinkimas
Pabaigos poskyris
Asmeninė funkcija „GetCheckedRadioButton“ (_
„ByVal“ tėvas kaip kontrolė) _
Kaip „RadioButton“
Dim FormControl kaip kontrolė
Dim RB As RadioButton
Kiekvienam iš tėvų „FormControl“. Valdikliai
Jei „FormControl“. „GetType“ () yra „GetType“ („RadioButton“) tada
RB = „DirectCast“ („FormControl“, „RadioButton“)
Jei RB.Patikrinta, tada grąžinkite RB
Pabaiga Jei
Kitas
Grąžinti nieko
Pabaigos funkcija

Veikiantis kodas atrodo taip:


Spustelėkite čia, norėdami pamatyti iliustraciją
Norėdami grįžti, spustelėkite naršyklės mygtuką Atgal