VB.NET tieši neatbalsta bitu līmeņa darbības. Ar Framework 1.1 (VB.NET 2003) tika ieviesti bitu nobīdes operatori (<< un >>), taču nav pieejams vispārīga mērķa veids, kā manipulēt ar atsevišķiem bitiem. Bitu operācijas var būt ļoti noderīgam. Piemēram, jūsu programmai varētu būt saskarne ar citu sistēmu, kurai nepieciešama bitu manipulācija. Bet papildus tam ir daudz triku, ko var izdarīt, izmantojot atsevišķus bitus. Šajā rakstā apskatīts, ko var izdarīt ar bitu manipulācijām, izmantojot VB.NET.
Jums jāsaprot bitwise operatori pirms kaut kā cita. Vietnē VB.NET šie ir:
- Un
- Vai
- Xor
- Nē
Bitu skaits vienkārši nozīmē, ka operācijas var veikt ar diviem bināriem numuriem pamazām. Microsoft izmanto patiesības tabulas dokumentēt bitu operācijas. Patiesības tabula Un ir:
1. bita 2. bita rezultāts
1 1 1
1 0 0
0 1 0
0 0 0
Manā skolā viņi mācīja Karnaugh kartes vietā. Karnaugh karte visām četrām operācijām ir parādīta attēlā zemāk.
Noklikšķiniet šeit, lai parādītu ilustrāciju
Noklikšķiniet uz pogas Atpakaļ pārlūkprogrammā, lai atgrieztos
Šis ir vienkāršs piemērs, izmantojot Un darbība ar diviem, četriem bināriem skaitļiem:
Rezultāts 1100 Un 1010 ir 1000.
Tas ir tāpēc, ka 1 Un 1 ir 1 (pirmais bits), bet pārējie ir 0.
Sākumā apskatīsim mazlietās operācijas ir tieši atbalstīts VB.NET: mazliet mainās. Lai gan ir pieejama gan kreisā, gan labā maiņa, tie darbojas vienādi, tāpēc tiks runāts tikai par kreiso maiņu. Bitu nobīde visbiežāk tiek izmantota kriptogrāfijā, attēlu apstrādē un sakaros.
VB.NET mazliet mainīgās operācijas ...
- Darbojieties tikai ar četriem veselu skaitļu veidiem: Baits, Īss, Vesels skaitlis, un Ilgi
- Ir aritmētika mainīgās operācijas. Tas nozīmē, ka biti, kas novirzīti garām rezultāta beigām, tiek izmesti, un bitu pozīcijas, kas atvērtas otrā galā, tiek iestatītas uz nulli. Alternatīvu sauc par riņķveida bitu nobīdi, un biti, kas nobīdīti gar vienu galu, tiek vienkārši pievienoti otram. VB.NET tieši neatbalsta apļveida bitu pārslēgšanu. Ja jums tas ir nepieciešams, jums tas būs jākodē vecmodīgā veidā: reizinot vai dalot ar 2.
- Nekad neveidojiet pārpildes izņēmumu. VB.NET rūpējas par iespējamām problēmām, un es jums parādīšu, ko tas nozīmē. Kā atzīmēts, jūs varat kodēt savu bitu nobīdi, reizinot vai dalot ar 2, bet, ja izmantojat "kodējiet savu" pieeju, jums jāpārbauda pārpildes izņēmumi, kas var izraisīt jūsu programmas darbību avārija.
Standarta bitu pārslēgšanas darbība izskatās apmēram šādi:
Dim StartingValue As Integer = 14913080
Dim ValueAfterShifting As Integer
ValueAfterShifting = StartingValue << 50
Vārdiem sakot, šī operācija iegūst bināro vērtību 0000 0000 1110 0011 1000 1110 0011 1000 (14913080 ir ekvivalenta decimālā vērtība - ņemiet vērā, ka tā ir tikai 3 0 un 3 1 sērija, kas atkārtota pāris reizes) un pārbīdiet to pa 50 vietām pa kreisi. Bet, tā kā vesels skaitlis ir tikai 32 biti, tā pārvietošana uz 50 vietām ir bezjēdzīga. VB.NET šo problēmu atrisina ar maskēšana maiņu skaits ar standarta vērtību, kas atbilst izmantotajam datu tipam. Šajā gadījumā, ValueAfterShifting ir Vesels skaitlis tātad maksimālais nobīdāmais ir 32 biti. Standarta maskas vērtība, kas darbojas, ir 31 zīme aiz komata vai 11111.
Maskēšana nozīmē, ka vērtība, šajā gadījumā 50, ir Uned ar masku. Tas dod maksimālo bitu skaitu, ko faktiski var nobīdīt šim datu tipam.
Aiz komata:
50 Un 31 ir 18 - Maksimālais bitu skaits, ko var nobīdīt
Binārā izteiksmē tam ir lielāka jēga. Augsta pasūtījuma biti, kurus nevar izmantot pārslēgšanas darbībai, tiek vienkārši noņemti.
110010 un 11111 ir 10010
Izpildot koda fragmentu, rezultāts ir 954204160 vai, binārā veidā, 0011 1000 1110 0000 0000 0000 0000 0000. 18 biti pirmā binārā skaitļa kreisajā pusē tiek nobīdīti, un 14 biti labajā pusē ir nobīdīti pa kreisi.
Otra lielā bitu nobīdes problēma ir tā, kas notiek, ja nobīdes vietu skaits ir negatīvs. Kā bitu skaitu izmantosim -50, lai mainītu un redzētu, kas notiek.
ValueAfterShifting = StartingValue << -50
Kad šis koda fragments tiek izpildīts, mēs iegūstam -477233152 vai 1110 0011 1000 1110 0000 0000 0000 0000 binārā izteiksmē. Skaits ir pārvietots par 14 vietām. Kāpēc 14? VB.NET pieņem, ka vietu skaits ir neparakstīts vesels skaitlis, un dara Un darbība ar to pašu masku (31 skaitļiem).
1111 1111 1111 1111 1111 1111 1100 1110
0000 0000 0000 0000 0000 0000 0001 1111
(Un)
0000 0000 0000 0000 0000 0000 0000 1110
1110 binārā ir aiz komata. Ņemiet vērā, ka tas ir pretējs pozitīvas 50 vietas novirzīšanai.
Nākamajā lapā mēs pārejam pie dažām citām bitu operācijām, sākot ar Xor šifrēšana!
Es minēju, ka viena bitu operāciju izmantošana ir šifrēšana. Xor šifrēšana ir populārs un vienkāršs faila “šifrēšanas” veids. Savā rakstā Ļoti vienkāršā šifrēšana, izmantojot VB.NET, es parādīšu labāku veidu, kā manipulācijas ar virkni. Bet Xor šifrēšana ir tik izplatīta, ka tā ir pelnījusi vismaz izskaidrot.
Teksta virknes šifrēšana nozīmē tās tulkošanu citā teksta virknē, kurai nav acīmredzamas saistības ar pirmo. Jums ir nepieciešams arī veids, kā to vēlreiz atšifrēt. Xor šifrēšana, izmantojot operāciju Xor, katras virknes rakstzīmes bināro ASCII kodu pārveido citā rakstzīmē. Lai izdarītu šo tulkojumu, jums ir nepieciešams cits numurs, kas jāizmanto Xor. Šo otro numuru sauc par taustiņu.
Xor šifrēšanu sauc par "simetrisku algoritmu". Tas nozīmē, ka mēs arī šifrēšanas atslēgu varam izmantot kā atšifrēšanas atslēgu.
Kā atslēgu izmantosim "A" un šifrēsim vārdu "Basic". ASCII kods “A” ir:
0100 0001 (65 zīme aiz komata)
ASCII kods Basic ir:
B - 0100 0010
a - 0110 0001
s - 0111 0011
i - 0110 1001
c - 0110 0011
Xor katrs no tiem ir:
0000 0011 - 3. zīme aiz komata
0010 0000 - 32. zīme aiz komata
0011 0010 - 50. zīme aiz komata
0010 1000 - aiz komata 40
0010 0010 - 34. zīme aiz komata
Šī mazā rutīna ir viltība:
- Xor šifrēšana -
Dim i kā īss
ResultString. Teksts = ""
Dim KeyChar kā vesels skaitlis
KeyChar = Asc (šifrēšanas atslēga. Teksts)
I = 1 līdz Len (InputString. Teksts)
ResultString. Teksts & = _
Chr (KeyChar Xor _
Asc (vidējā (InputString. Teksts, i, 1)))
Nākamais
Rezultātu var redzēt šajā ilustrācijā:
Noklikšķiniet šeit, lai parādītu ilustrāciju
Noklikšķiniet uz pogas Atpakaļ pārlūkprogrammā, lai atgrieztos
Lai atgrieztu šifrēšanu, vienkārši nokopējiet un ielīmējiet virkni no Rezultātu lodziņa atpakaļ virknes tekstlodziņā un vēlreiz noklikšķiniet uz pogas.
Vēl viens piemērs tam, ko varat darīt ar bitu lieluma operatoriem, ir apmainīt divus veselus skaitļus, nedeklarējot trešo mainīgo lielumu pagaidu glabāšanai. Tas ir veids, ko viņi pirms gadiem darīja montāžas valodu programmās. Tagad tas nav pārāk noderīgi, taču kādu dienu jūs varētu laimēt derības, ja varat atrast kādu, kurš netic, ka varat to izdarīt. Jebkurā gadījumā, ja jums joprojām ir jautājumi par to, kā Xor strādājot, izmantojot šo darbu, viņiem vajadzētu atpūsties. Šis ir kods:
Dim FirstInt kā vesels skaitlis
Dim SecondInt kā vesels skaitlis
FirstInt = CInt (FirstIntBox. Teksts)
SecondInt = CInt (SecondIntBox. Teksts)
FirstInt = FirstInt Xor SecondInt
SecondInt = FirstInt Xor SecondInt
FirstInt = FirstInt Xor SecondInt
Rezultātu lodziņš. Teksts = "Pirmais vesels skaitlis:" & _
FirstInt. Virkne un "-" & _
"Otrais vesels skaitlis:" & _
SecondInt. ToString
Un šeit ir kods darbībā:
Noklikšķiniet šeit, lai parādītu ilustrāciju
Noklikšķiniet uz pogas Atpakaļ pārlūkprogrammā, lai atgrieztos
Precīzi izdomājot, kāpēc tas darbojas, tas tiks atstāts kā „kā vingrinājums studentam”.
Nākamajā lapā mēs sasniedzam mērķi: Vispārīgas bitu manipulācijas
Lai arī šie triki ir jautri un izglītojoši, tie joprojām neaizvieto vispārējas manipulācijas ar bitiem. Ja jūs patiešām nonākat līdz bitu līmenim, tas, ko vēlaties, ir veids, kā izpētīt atsevišķus bitus, iestatīt tos vai mainīt. Tas ir īstais kods, kura trūkst .NET.
Iespējams, iemesls, kāpēc tā pietrūkst, ir tas, ka nav tik grūti rakstīt apakšprogrammas, kuras izpilda to pašu.
Tipisks iemesls, kāpēc jūs varētu vēlēties to darīt, ir saglabāt to, ko dažreiz sauc par karoga baits. Dažas lietojumprogrammas, it īpaši tās, kas rakstītas zema līmeņa valodās, piemēram, montētājs, uzturēs astoņus Būla karodziņus vienā baitā. Piemēram, 6502 procesora mikroshēmas statusa reģistrā ir šī informācija vienā 8 bitu baitā:
7. bits. Negatīvs karodziņš
6. bits. Pārpildes karogs
5. bits. Neizmantots
4. bits. Lauzt karogu
3. bits. Decimālzīme
2. bits. Pārtraukt-atspējot karogu
1. bits. Nulles karogs
Bits 0. Nesiet karogu
(no Wikipedia)
Ja jūsu kodam ir jādarbojas ar šāda veida datiem, jums nepieciešams vispārējas nozīmes bitu manipulācijas kods. Šis kods darīs darbu!
'ClearBit Sub notīra 1. bāzes n-to bitu
'(MyBit) no vesela skaitļa (MyByte).
Sub ClearBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
Izveidojiet bitmasku, izmantojot komplektu no 2. līdz n.
BitMask = 2 ^ (MyBit - 1)
'Notīrīt n-to bitu:
MyByte = MyByte, nevis BitMask
Beigas apakš
'Funkcija ExamineBit atgriezīs patieso vai nepatieso vērtību
'atkarībā no 1 balstītā, n. bita (MyBit) vērtības
vesels skaitlis (MyByte).
Funkcija ExamineBit (ByVal MyByte, ByVal MyBit) kā Būla
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
ExamineBit = ((MyByte un BitMask)> 0)
Beigu funkcija
'SetBit Sub iestatīs n-to bitu, kura pamatā ir 1
'(MyBit) no vesela skaitļa (MyByte).
Sub SetBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte vai BitMask
Beigas apakš
'ToggleBit Sub mainīs stāvokli
'no 1 balstītā, n. bita (MyBit)
vesels skaitlis (MyByte).
Sub ToggleBit (ByRef MyByte, ByVal MyBit)
Dim BitMask As Int16
BitMask = 2 ^ (MyBit - 1)
MyByte = MyByte Xor BitMask
Beigas apakš
Lai parādītu kodu, šī rutīna to izsauc (parametri nav kodēti Click Sub):
Privāts sub ExBitCode_Click (...
Dim Byte1, Byte2 As Byte
Dim MyByte, MyBit
Dim StatusOfBit kā Būla
Dim atlasītsRB kā stīga
StatusLine. Teksts = ""
SelectedRB = GetCheckedRadioButton (Me) .Name
1. baits = ByteNum. Teksts 'Skaitlis, kas jāpārvērš bitu karodziņos
2. baits = BitNum. Teksts “Pārslēdzams bits”
“Tālāk tiek notīrīts augstās kārtas baits un tiek atgriezts tikai
'zema pasūtījuma baits:
MyByte = 1. baits un & HFF
MyBit = 2. baits
Atlasiet Case SelectedRB
Lieta "ClearBitButton"
ClearBit (MyByte, MyBit)
StatusLine. Teksts = "Jauns baits:" un MyByte
Lieta "ExamineBitButton"
StatusOfBit = ExamineBit (MyByte, MyBit)
StatusLine. Teksts = "Bit" & MyBit & _
"ir" & StatusOfBit
Lieta "SetBitButton"
SetBit (MyByte, MyBit)
StatusLine. Teksts = "Jauns baits:" un MyByte
Lieta "ToggleBitButton"
ToggleBit (MyByte, MyBit)
StatusLine. Teksts = "Jauns baits:" un MyByte
Beigt atlasi
Beigas apakš
Privāta funkcija GetCheckedRadioButton (_
ByVal vecāks kā kontrole) _
Kā RadioButton
Dim FormControl kā vadību
Dim RB As RadioButton
Par katru vecāku formControl. Kontroles
Ja FormControl. GetType () ir GetType (RadioButton) Tad
RB = DirectCast (FormControl, RadioButton)
Ja RB.Pārbaudīts, tad atgrieziet RB
Beigt ja
Nākamais
Neatgriezt neko
Beigu funkcija
Darbībā esošais kods izskatās šādi:
Noklikšķiniet šeit, lai parādītu ilustrāciju
Noklikšķiniet uz pogas Atpakaļ pārlūkprogrammā, lai atgrieztos