U ovom vodiču naučit ćete o različitim bitnim operacijama u Swiftu. Oni se koriste za izračunavanje razine bita u izrazu.
Bit se koristi za označavanje binarne znamenke. Binarna znamenka može imati dvije moguće vrijednosti 0 ili 1. Kao programer na početnoj razini, ne morate raditi s operacijama na razini bita.
Dovoljan je rad s primitivnim vrstama podataka kao što su: integer, float, boolean, string itd. Možda ćete morati raditi na razini bita kada se bavite programiranjem na niskoj razini.
Swift pruža bogat skup operatora, osim osnovnih operatora, za manipulaciju bitovima. Ti su operatori slični logičkim operatorima, osim što rade na binarnim prikazima podataka (bitova).
Bitovni operatori su operatori koji se koriste za promjenu pojedinačnih bitova operanda. Operand je varijabla ili konstanta u kojoj se vrši operacija.
Svi bitni operateri dostupni u brzom donosu navedeni su u nastavku:
1. Bitni NE operator
Predstavlja se ~
znakom tilde i može se primijeniti na jedan operand. Ovo invertira sve bitove. tj. promjene 1 na 0 i 0 na 1.
Ako je x varijabla / konstanta koja sadrži binarnu vrijednost, tj. 0 ili 1. Bitna ne-operacija x varijable može se predstaviti u donjoj tablici:
NEx | ~ x |
---|---|
0 | 1 |
1 | 0 |
Primjer 1: Bitni operator NOT za nepotpisani cijeli broj
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Kada pokrenete gornji program, izlaz će biti:
254
U gornjem programu, izjava let initalNumber:UInt8 = 1
je tipa Unsigned int veličine 8 bita. Dakle, 1 u decimalnom obliku može se predstaviti kao 00000001
u binarnom.
Operator bit-a ne mijenja sve bitove varijable ili konstante, bit 0 se mijenja u 1 i 1 u 0. Dakle, invertedNumber sadrži bitove 11111110
. Nakon pretvaranja u decimalni prikaz predstavlja se kao 254. Dakle, izraz print(invertedNumber)
daje 254 na zaslon.
Također možete izvesti bitni operator izravno u bitovima kao:
Primjer 2: Bitni NE operator u bitovima
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Kada pokrenete gornji program, izlaz će biti:
0
InitialBits sadrži binarnu vrijednost 11111111
koja odgovara 255 u decimalu. Za predstavljanje broja u binarnom obliku imamo 0b
kao prefiks u doslovcu. Bez 0b
prefiksa, tretirat će ga kao uobičajeni cijeli broj i dobit ćete pogrešku prelijevanja (UInt8 može pohraniti brojeve od samo 0 do 255).
Budući da smo koristili bitni ne operator, on mijenja svih 1 na 0. Dakle, konstanta invertedBits sadrži 00000000
što je ekvivalentno 0 u UInt8
.
Primjer 3: Bitni NE operator za potpisan cijeli broj
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Kada pokrenete gornji program, izlaz će biti:
-2
U gore navedenom programu 1 u decimalnom obliku može se predstaviti kao 00000001
u binarnom. Operator bit-a ne mijenja sav bit varijable ili konstante, bit 0 se mijenja u 1 i 1 u 0. Dakle, invertedNumber sadrži bitove 11111110
. To bi trebalo prikazati 254 na zaslonu. Ali umjesto toga vraća -2. Čudno, zar ne ?? Istražimo u nastavku kako se to dogodilo.
let initalNumber:Int = 1
je potpisani int koji može sadržavati i pozitivne i negativne cijele brojeve. Zato kada smo primijenili operator not za potpisani cijeli broj, vraćena binarna datoteka također može predstavljati negativan broj.
Kako je prevodilac interpretirao -2 kao 11111110
u binarnom?
Prevoditelj je upotrijebio Two-ov komplement za predstavljanje cijelih brojeva. Da biste dobili komplementarni negativni zapis cijelog broja, prvo biste trebali zapisati broj u binarnom obliku, a zatim obrnuti znamenke i dodati jedan rezultatu.
Koraci kako biste saznali dopunu dva od -2 :
- Napišite 2 u binarnom obliku:
00000010
- Obrni znamenke. 0 postaje 1 i 1 postaje 0:
11111101
- Dodaj 1:
11111110
Tako prevoditelj interpretira binarni broj 1111110
kao -2
decimalni. No, postoji mali zaokret koji je napravio taj kompajler, a koji nismo primijetili. Također je zaključio tip invertedNumber kao Int8
tip.
Da bismo to razumjeli, pogledajmo primjer u nastavku:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Kada pokrenete gornji program, izlaz će biti:
-2 254
U gore navedenom primjeru, prevodilac je binarni broj tretirao na -2 u decimalnom obliku samo za Potpisani 8-bitni cijeli broj. Stoga izjava print(Int8(bitPattern: 0b11111110))
na ekranu izlazi -2.
Ali za normalni cijeli broj čija je veličina 32/64 bit i može sadržavati velike vrijednosti, on tumači vrijednost kao 254
. Stoga izraz print(0b11111110)
daje 254 na zaslon.
2. Bitni i operator
Zastupljen je &
i može se primijeniti na dva operanda. Operator AND uspoređuje dva bita i vraća 1 ako su oba bita 1, u suprotnom vraća 0.
Ako su x i y varijabla / konstanta koja sadrži binarnu vrijednost, tj. 0 ili 1. Bitovna operacija AND na x i y može se predstaviti u donjoj tablici:
Ix | g | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Primjer 5: Bitni rad I
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Kada pokrenete gornji program, izlaz će biti:
Binarni: 10000011 131
U gornjem programu izjava let result = xBits & yBits
kombinira bitove dva operanda xBits i yBits. Vraća 1 ako su oba bita 1, inače vraća 0.
String(value , radix: )
inicijalizator se koristi za predstavljanje broja u različitim brojevnim sustavima. Ako dostavimo vrijednost radix 2. Pretvara broj u binarni brojevni sustav. Slično tome, možemo koristiti 16 za hex i 10 za decimal.
Izjava na ekranu print("Binary:",String(result, radix: 2))
daje Binarni: 10000011 . 10000011
ekvivalentno je 131 u decimalnom obliku, izraz print(result)
daje 131 u konzoli.
3. Bitni ILI operator
Predstavljen je kao |
i može se primijeniti na dva operanda. Bitni ILI operator uspoređuje dva bita i generira rezultat 1 ako je jedan ili više njegovih ulaza 1 inače 0.
Ako su x i y varijabla / konstanta koja sadrži binarnu vrijednost, tj. 0 ili 1. Bitovna ILI operacija na x i y može se predstaviti u donjoj tablici:
ILIx | g | x | g |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Primjer 6: Bitovna ILI operacija
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Kada pokrenete gornji program, izlaz će biti:
Binarni: 11111111 255
U gornjem programu izjava let result = xBits | yBits
kombinira bitove dvije konstante xBits i yBits. Vraća 1 ako je bilo koji od bitova 1, inače vraća 0.
Izjava na ekranu print("Binary:",String(result, radix: 2))
daje Binarni: 11111111 . Budući da 11111111
je ekvivalentan 255
decimalnom značenju, izraz print(result)
prikazuje 255 na zaslonu.
4. Bitni XOR operator
Predstavljen je kao ^
i može se primijeniti na dva operanda. XOR operator uspoređuje dva bita i generira rezultat 1 ako je točno jedan od njegovih ulaza 1, inače vraća 0.
Ako su x i y varijabla / konstanta koja sadrži binarnu vrijednost, tj. 0 ili 1. Bitovna XOR operacija na x i y može se predstaviti u donjoj tablici:
XORx | g | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Primjer 7: Bitni XOR rad
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Kada pokrenete gornji program, izlaz će biti:
Binarni: 1111100 124
U gornjem programu izjava let result = xBits yBits
kombinira bitove dvije konstante xBits i yBits. Vraća 1 ako je točno jedan od bitova 1, inače vraća 0.
Izjava na zaslon print("Binary:",String(result, radix: 2))
daje Binarni: 1111100 (ekvivalentno 01111100). Budući da 1111100
je ekvivalentan 124
decimalnom značenju, iskaz print(result)
izlazi na zaslon 124 .
5. Operator pomicanja u bitovima
Ovi se operateri koriste za pomicanje svih bitova u broju ulijevo ili udesno za određeni broj mjesta i mogu se primijeniti na jedan operand. Predstavljen je kao <<
ili >>
.
Dvije su vrste operatora smjene:
Operator u smjeru lijevog pomaka
- Označava se kao
<<
- Uzrokuje pomicanje bitova ulijevo, određeno brojem iza kojeg slijedi
<<
. - Položaji bitova koji su napušteni operacijom smjene su popunjeni nulom.
- Pomicanje cjelobrojnih bitova ulijevo za jedan položaj udvostručuje njegovu vrijednost
Primjer 8: Operator pomaka u smjeru lijeva
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Kada pokrenete gornji program, izlaz će biti:
136
U gore navedenom programu koristili smo operatora lijeve smjene. Korištenje <<
1 znači pomicanje bita za 1 ulijevo. Znamenke se pomiču ulijevo za jedan položaj, a zadnja znamenka s desne strane ispunjava se nulom.
Također možete vidjeti kako se gubi znamenka koja se pomakne "s kraja" s lijeve strane. Ne ovija se ponovno s desne strane. Pomicanjem jednog bita ulijevo uklanja se 1 iz binarnog sustava i dodaje 0 u desno kako bi se popunila pomaknuta vrijednost, a ostatak ostalih bitova pomaknut je prema lijevom položaju za 1.
To se vraća 10001000
što je ekvivalentno 136
in UInt8
. Stoga print(someBits << 1)
izraz daje 136 na ekranu.
Operator pomaka u bitnom smjeru
- Označava se kao
>>
- Uzrokuje pomicanje bitova udesno za brojem iza kojeg slijedi
>>
- Za nepotpisane brojeve, položaji bitova koji su napušteni operacijom smjene su popunjeni nulom.
- Za potpisane brojeve (brojeve koji također mogu biti negativni) znakovni bit koristi se za popunjavanje praznih mjesta bitova. Drugim riječima, ako je broj pozitivan, koristi se 0, a ako je broj negativan, koristi se 1.
- Pomicanjem udesno za jedan položaj prepolovite njegovu vrijednost.
Primjer 9: Operator pomaka u bitnom smjeru za nepotpisani cijeli broj
let someBits: UInt8 = 4 print(someBits>> 1)
Kada pokrenete gornji program, izlaz će biti:
2
U gore navedenom programu koristili smo operator desnog pomaka na nepotpisanom cijelom broju. Korištenje >>
1 znači pomicanje bita za 1 udesno. Položaji bitova koji su napušteni operacijom smjene uvijek su na nepotpisanom cijelom broju ispunjeni nulom.
Budući da je 4 predstavljeno kao 00000100
u binarnom. Pomicanjem za jedan bit udesno, vraća se 00000010
što je ekvivalentno 2
in UInt8
. Stoga print(someBits>> 1)
izraz daje 2 na zaslon.
Primjer 10: Operator pomaka u bitnom smjeru za potpisani cijeli broj
let someBits:Int = -4 print(someBits>> 1)
Kada pokrenete gornji program, izlaz će biti:
-2
U gore navedenom programu koristili smo operator desnog pomaka na nepotpisanom cijelom broju. Za razliku od pozitivnih brojeva, >>
za negativne brojeve, umjesto 0 koristi se 1 za popunjavanje upražnjenog mjesta.
Budući da je, -4
predstavljen kao 11111100
u binarnom. Pomicanjem jednog bita udesno i postavljanjem 1 na slobodno mjesto, vraća se 11111110
što je ekvivalentno -2
za Int8
tip. Stoga print(someBits>> 1)
izjava na ekranu daje izlaz -2.