Ce sunt operatorii pe biți?

Într-un program de calculator, operatorii pe biți sunt operatori pentru manipularea tiparelor de biți în expresii. ȘI pe biți, SAU, SAU exclusiv (XOR), NOT, deplasarea la dreapta și deplasarea la stânga sunt operații comune. Majoritatea limbajelor de programare pentru computere includ toți acești șase operatori. Ele sunt adesea folosite pentru setarea, ștergerea sau inversarea biților individuali în programele care controlează hardware-ul computerului. Operatorii pe biți sunt, de asemenea, folosiți frecvent în algoritmii de criptare și compresie a datelor.

Operatorii obișnuiți pe biți sunt de obicei reprezentați simbolic în limbaje de programare precum C, C++ și Java. Ele sunt folosite în expresii la fel cum ar fi operatorii aritmetici precum semnele plus sau minus. Operatorul pe biți AND este reprezentat cu ampersand &, SAU cu țeava | și XOR cu accent ^. NOT, cunoscut și ca operator de complement, este indicat cu o tilde ~.

Operatorul de schimbare la dreapta folosește o semnătură dublă care indică spre dreapta >>. În schimb, deplasarea la stânga este indicată de un semn de intercalare dublu îndreptat spre stânga. Java include o altă operațiune de deplasare la dreapta, afișată cu un triplu-caret îndreptat spre dreapta >>>.

Operatorii pe biți aplică o operație logică fiecărei perechi de biți din operanzii lor. NOT, deplasarea la dreapta și deplasarea la stânga au un singur operand adevărat; a doua valoare în operațiunile de schimbare este numărul de biți. Pentru a înțelege mai bine cum funcționează operatorii pe biți, o persoană își poate vizualiza operanzii ca numere binare. De exemplu, operatorul complement întoarce fiecare bit al operandului său unic în starea opusă. Un unu devine zero și zero devine unu. Complementul valorii binare de 8 biți 00110101 este 11001010.

Operatorul AND are doi operanzi. Bit cu bit, o operație logică AND este efectuată folosind un bit corespunzător din fiecare operand. Rezultatul fiecărei operații pe biți este plasat în acea poziție de biți a rezultatului general. De exemplu, operatorul AND va procesa bitul 7 al unui operand cu bitul 7 al celuilalt operand. Rezultatul va fi stocat în bitul 7 al rezultatului general.

Într-o operație AND, ambii biți operanzi trebuie să fie unu pentru ca rezultatul să fie unul, altfel rezultatul este zero. De exemplu, dacă valorile binare pe 8 biți ale operanzilor sunt 00110101 și 11110000, rezultatul va fi 00110000. O utilizare obișnuită a operatorului AND este de a reduce la zero biți anumiți din rezultat. Acest lucru se face prin plasarea zerourilor în acele poziții de biți într-unul dintre operanzi.
Într-o operație SAU, ambii biți operanzi trebuie să fie zero pentru ca rezultatul să fie zero; altfel, rezultatul este unul. O utilizare comună a operatorului SAU este de a seta anumiți biți ai rezultatului la unii. Acest lucru se face prin plasarea celor în acele poziții de biți într-unul dintre operanzi. Pentru operația XOR, rezultatul este zero dacă ambii biți de operand sunt zero sau dacă ambii biți de operand sunt unu; în caz contrar, rezultatul este unul.
Deplasarea la stânga și deplasarea la dreapta mută biții din operand la stânga sau la dreapta cu numărul specificat de poziții de biți. O schimbare logică la dreapta mută un zero în bitul din stânga ca parte a deplasării. O deplasare aritmetică la dreapta copiază bitul din stânga – bitul semn – înainte de schimbare în aceeași poziție după schimbare. Bitul original este, de asemenea, mutat la dreapta împreună cu restul. Oricare tip de deplasare la stânga mută un zero în bitul din dreapta.
Când un operand este deplasat la dreapta, bitul din dreapta înainte de schimbare este pur și simplu aruncat. În mod similar, bitul din stânga dinaintea unei deplasări la stânga este eliminat. Nu se înfășoară la celălalt capăt al operandului.
Operațiile de schimbare pe biți depind de limbaj și de implementare. De exemplu, în C și C++, >> și efectuați deplasări logice dacă operandul este un întreg fără semn. Dacă operandul este un întreg cu semn, este probabil să se facă o schimbare aritmetică. În Java, toți operanzii sunt considerați semnați, iar deplasările aritmetice sunt întotdeauna efectuate cu >> și . Operatorul >>> este folosit pentru o schimbare logică la dreapta, dar este totuși posibil să faceți accidental o schimbare aritmetică la dreapta fără o tipare atentă.
Complicațiile pot apărea și atunci când operanzii au lungimi de biți diferite sau când unii sunt semnati și alții nesemnați. Operatorii pe biți și constantele numerice din mijlocul unei expresii complexe pot să nu fie evaluate așa cum se anticipa. Trebuie avut grijă să specificați dimensiunea și natura semnată/nesemnată a fiecărei cantități din expresie. Acest lucru se poate face cu tipărire atentă sau atribuiri intermediare la anumite tipuri de variabile din codul programului.