Operatori Swift Bitwise și Bit Shift (cu exemple)

În acest tutorial, veți afla despre diferite operațiuni bitbit în Swift. Acestea sunt utilizate pentru calculul nivelului de biți într-o expresie.

Un bit este folosit pentru a indica o cifră binară. O cifră binară poate avea două valori posibile fie 0, fie 1. În calitate de programator de nivel pentru începători, nu trebuie să lucrați cu operații la nivelul de biți.

Este suficient să lucrați cu tipuri de date primitive, cum ar fi: întreg, float, boolean, șir etc. Este posibil să trebuiască să lucrați la nivel de biți atunci când aveți de-a face cu programare de nivel scăzut.

Swift oferă un set bogat de operatori, în afară de operatorii de bază, pentru manipularea biților. Acești operatori sunt similari cu operatorii logici, cu excepția faptului că funcționează pe reprezentări binare ale datelor (biți).

Operatorii bitwise sunt operatori care sunt folosiți pentru a schimba biții individuali ai unui operand. Operand este o variabilă sau constantă în care se face operația.

Toți operatorii bit-bit disponibili în rapid sunt enumerați mai jos:

1. Bitwise NU Operator

Este reprezentat de ~semnul tilde și poate fi aplicat pe un singur operand. Aceasta inversează toți biții. adică schimbările 1 la 0 și 0 la 1.

Dacă x este o variabilă / constantă care deține o valoare binară, adică 0 sau 1. Operația în sensul bitului pe variabila x poate fi reprezentată în tabelul de mai jos:

NU
X ~ x
0 1
1 0

Exemplul 1: operator bitwise NOT pentru întregul nesemnat

 let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Când rulați programul de mai sus, ieșirea va fi:

 254

În programul de mai sus, instrucțiunea let initalNumber:UInt8 = 1este de tip Unsigned int de dimensiunea 8 biți. Deci, 1 în zecimal poate fi reprezentat ca 00000001în binar.

Operatorul bitwise not schimbă tot bitul unei variabile sau constante, bitul 0 este schimbat la 1 și 1 la 0. Deci Numărul inversat conține biți 11111110. După ce îl convertești în zecimal, este reprezentat ca 254. Deci, instrucțiunea print(invertedNumber)scoate 254 pe ecran.

Puteți efectua, de asemenea, operator bit în mod direct în biți ca:

Exemplul 2: operator bitwise NU în biți

 let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits) 

Când rulați programul de mai sus, ieșirea va fi:

 0

initialBits conține o valoare binară 11111111care corespunde cu 255 în zecimal. Pentru a reprezenta numărul în binar avem 0bca prefix în literal. Fără 0bca prefix, îl va trata ca un număr întreg normal și veți primi o eroare de depășire (UInt8 poate stoca numere de la doar 0 la 255).

Întrucât, am folosit operatorul bitwise, nu schimbă toate valorile de la 1 la 0. Deci, constanta inversată Bit conține 00000000care este echivalent cu 0 in UInt8.

Exemplul 3: operator bitwise NU pentru întregul semnat

 let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Când rulați programul de mai sus, ieșirea va fi:

 -2

În programul de mai sus, 1 în zecimal poate fi reprezentat ca 00000001în binar. Operatorul bitwise not schimbă tot bitul unei variabile sau constante, bitul 0 este schimbat la 1 și 1 la 0. Deci, Numărul inversat conține biți 11111110. Aceasta ar trebui să afișeze 254 pe ecran. Dar în schimb returnează -2. Ciudat, nu? Să explorăm mai jos cum s-a întâmplat acest lucru.

let initalNumber:Int = 1este un int semnat care poate conține atât numere întregi pozitive, cât și negative. De aceea, atunci când am aplicat operatorul pentru un număr întreg semnat, binarul returnat poate reprezenta și un număr negativ.

Cum a interpretat compilatorul -2 ca 11111110 în binar?

Compilatorul a folosit complementul lui Two pentru a reprezenta numere întregi. Pentru a obține notarea negativă a complementului celor doi a unui număr întreg, ar trebui mai întâi să scrieți numărul în binar, apoi să inversați cifrele și să adăugați una la rezultat.

Pași pentru a afla complementul lui Two de -2 :

  1. Scrieți 2 în formă binară: 00000010
  2. Inversați cifrele. 0 devine 1 și 1 devine 0:11111101
  3. Adăugați 1: 11111110

Acesta este modul în care compilatorul interpretează numărul binar 1111110ca -2în zecimal. Dar, există o mică întorsătură pe care a făcut-o compilatorul, pe care nu am observat-o. De asemenea, a dedus tipul de Număr inversat ca Int8tip.

Pentru a înțelege acest lucru, să vedem un exemplu mai jos:

 print(Int8(bitPattern: 0b11111110)) print(0b11111110)

Când rulați programul de mai sus, ieșirea va fi:

 -2 254

În exemplul de mai sus, compilatorul a tratat numărul binar la -2 în zecimal doar pentru întregul semnat pe 8 biți. Prin urmare, instrucțiunea print(Int8(bitPattern: 0b11111110))scoate -2 în ecran.

Dar pentru tipul întreg normal a cărui dimensiune este de 32/64 biți și poate conține valori mari, interpretează valoarea ca fiind 254. Prin urmare, instrucțiunea print(0b11111110)emite 254 pe ecran.

2. Operator bit și bit

Este reprezentat de &și poate fi aplicat pe doi operanzi. Operatorul AND compară doi biți și returnează 1 dacă ambii biți sunt 1, altfel returnează 0.

Dacă x și y sunt variabile / constante care dețin valoare binară adică 0 sau 1. Operațiunea ȘI bitwise pe x și y poate fi reprezentată în tabelul de mai jos:

ȘI
X y X y
0 0 0
0 1 0
1 1 1
1 0 0

Exemplul 5: operațiune bit și AND

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)

Când rulați programul de mai sus, ieșirea va fi:

 Binar: 10000011 131 

În programul de mai sus, instrucțiunea let result = xBits & yBitscombină biții a doi operanzi xBits și yBits. Returnează 1, ambii biți sunt 1, altfel returnează 0.

String(value , radix: )inițializatorul este utilizat pentru a reprezenta numărul într-un sistem numeric diferit. Dacă furnizăm valoarea radix 2. Acesta convertește numărul în sistem numeric binar. În mod similar, putem folosi 16 pentru hex și 10 pentru zecimal.

Instrucțiunea print("Binary:",String(result, radix: 2))emite Binary: 10000011 în ecran. 10000011este echivalent cu 131 în zecimal, declarația print(result)scoate 131 în consolă.

3. Operator bitwise SAU

Este reprezentat ca |și poate fi aplicat pe doi operanzi. Operatorul OR în biți compară doi biți și generează un rezultat de 1 dacă una sau mai multe dintre intrările sale sunt 1 altfel 0.

Dacă x și y sunt variabile / constante care dețin o valoare binară adică 0 sau 1. Operațiunea OR bitwise pe x și y poate fi reprezentată în tabelul de mai jos:

SAU
X y x | y
0 0 0
0 1 1
1 1 1
1 0 1

Exemplul 6: operație SAU bit

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result) 

Când rulați programul de mai sus, ieșirea va fi:

 Binar: 11111111 255 

În programul de mai sus, instrucțiunea let result = xBits | yBitscombină biții a două constante xBiți și yBiți. Returnează 1 dacă oricare dintre biți este 1 altfel returnează 0.

Instrucțiunea print("Binary:",String(result, radix: 2))emite Binary: 11111111 în ecran. Deoarece, 11111111este echivalent cu 255în zecimal, declarația print(result)afișează 255 pe ecran.

4. Operator bitwise XOR

Este reprezentat ca ^și poate fi aplicat pe doi operanzi. Operatorul XOR compară doi biți și generează un rezultat de 1 dacă exact una dintre intrările sale este 1 altfel returnează 0.

Dacă x și y sunt variabile / constante care dețin o valoare binară adică 0 sau 1. Operațiunea XOR bitwise pe x și y poate fi reprezentată în tabelul de mai jos:

XOR
X y x y
0 0 0
0 1 1
1 1 0
1 0 1

Exemplul 7: Operațiune bit bit XOR

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result) 

Când rulați programul de mai sus, ieșirea va fi:

 Binar: 1111100 124 

În programul de mai sus, instrucțiunea let result = xBits yBitscombină biții a două constante xBiți și yBiți. Returnează 1 dacă exact unul dintre biți este 1 altfel returnează 0.

Instrucțiunea print("Binary:",String(result, radix: 2))afișează Binary: 1111100 (echivalent cu 01111100) pe ecran. Deoarece, 1111100este echivalent cu 124în zecimal, instrucțiunea print(result)afișează 124 pe ecran.

5. Operator de schimbare bitwise

Acești operatori sunt folosiți pentru a muta toți biții dintr-un număr la stânga sau la dreapta cu un anumit număr de locuri și pot fi aplicați pe un singur operand. Este reprezentat ca <<sau >>.

Există două tipuri de operatori de schimb:

Operator de schimbare în stânga pe biți

  • Notat ca <<
  • Aceasta face ca biții să fie deplasați la stânga specificat de numărul urmat de <<.
  • Pozițiile de biți care au fost eliberate de operația de schimbare sunt completate cu zero.
  • Deplasarea biților unui număr întreg la stânga cu o poziție își dublează valoarea

Exemplul 8: operator de deplasare pe stânga pe biți

 let someBits:UInt8 = 0b11000100 print(someBits << 1) 

Când rulați programul de mai sus, ieșirea va fi:

 136

În programul de mai sus, am folosit operatorul shift stânga. Folosind <<1 înseamnă să deplasați bitul cu 1 spre stânga. Cifrele sunt deplasate spre stânga cu o poziție, iar ultima cifră din dreapta este completată cu un zero.

De asemenea, puteți vedea cifra care se deplasează „de la capăt” din partea stângă se pierde. Nu se înfășoară din nou de la dreapta. Deplasarea acestuia cu un bit spre stânga elimină 1 din binar și adaugă 0 în dreapta pentru a umple valoarea deplasată, iar restul celorlalți biți sunt deplasați spre poziția stângă cu 1.

Se întoarce, 10001000ceea ce este echivalent cu 136în UInt8. Prin urmare, print(someBits << 1)declarația afișează 136 pe ecran.

Operator de schimbare în dreapta pe biți

  • Notat ca >>
  • Aceasta face ca biții să fie deplasați la dreapta de numărul urmat de >>
  • Pentru numerele nesemnate, pozițiile de biți care au fost eliberate de operația de schimbare sunt completate zero.
  • Pentru numerele semnate (numere care pot fi și negative), bitul de semn este utilizat pentru a umple pozițiile de bit libere. Cu alte cuvinte, dacă numărul este pozitiv, se folosește 0, iar dacă numărul este negativ, se folosește 1.
  • Deplasarea la dreapta cu o poziție îi înjumătățește valoarea.

Exemplul 9: Operator de deplasare la dreapta pe biți pentru întregul nesemnat

 let someBits: UInt8 = 4 print(someBits>> 1) 

Când rulați programul de mai sus, ieșirea va fi:

 2

În programul de mai sus, am folosit operatorul de schimbare dreapta pe un număr întreg nesemnat. Folosind >>1 înseamnă să deplasați bitul cu 1 spre dreapta. Pozițiile de biți care au fost eliberate de operația de schimbare sunt întotdeauna completate zero pe un număr întreg nesemnat.

Deoarece, 4 este reprezentat ca 00000100în binar. Deplasând-o un pic spre dreapta, se întoarce 00000010echivalentul 2în UInt8. Prin urmare, print(someBits>> 1)declarația iese 2 pe ecran.

Exemplul 10: Operator de deplasare în dreapta pe biți pentru întregul semnat

 let someBits:Int = -4 print(someBits>> 1) 

Când rulați programul de mai sus, ieșirea va fi:

 -2

În programul de mai sus, am folosit operatorul de schimbare dreapta pe un număr întreg nesemnat. Spre deosebire de numerele pozitive, folosind >>numerele negative, 1 este utilizat pentru a umple locul liber, în loc de 0.

Deoarece, -4este reprezentat ca 11111100în binar. Deplasând-o cu un bit spre dreapta și plasând 1 în poziția liberă, se întoarce 11111110echivalentul -2pentru Int8tip. Prin urmare, print(someBits>> 1)instrucțiunea scoate -2 pe ecran.

Articole interesante...