Salutare dragi prieteni!Este pentru prima data cand scriu ceva aici si am ceva emotii. M-am gandit zilele astea sa scriu despre ceva ce este necesar in cazul in care vreti sa va angajati la firme serioase precum Microsoft. Dupa cum spune si titlul articolului, astazi vom discuta despre lucrul pe biti. Stiu ca numele suna oarecum ciudat dar credeti-ma ca problemele sunt si mai ciudate (glumesc stati linistiti). O sa incep mai intai cu cateva chestii care trebuie lamurite inainte sa trec la operatiile pe biti.
In primul rand, numerele intregi sunt reprezentate in memorie in baza 2, iar lungimea lor poate avea 8,16 sau 32 de biti. Felul in care sunt memorate aceste numere se numeste cod complementar. Sa zicem ca vrem sa prezentam numarul 5 in cod complementar. 5 scris in baza 2 este 101 (se citeste unu zero unu si nu o suta unu). Reprezentarea lui pe 8 biti ar arata cam asa:
Dupa cate puteti observa, ceilalti biti s-au umplut cu 0 pana la ultimul bit.
Operatiile pe biti
Ei se pot aplica datelor ce fac parte din tipul numerelor intregi.
1.Operatorul de conjunctie
Se noteaza cu & si acesta returneaza numarul intreg a carui reprezentare se obtine prin conjunctia bitilor din reprezentarea operanzilor in cod complementar.Ca sa puteti intelege o sa fac un tabel cu valorile care rezulta din aplicarea acestui operator si un exemplu:
Valoare bit 1 | Valoare bit 2 | Rezultat dupa aplicarea & |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
0 | 0 | 0 |
Exemplu:Reprezentarea lui 5 este 00000101 iar a lui 3 este 00000011.Cand aplicam operatorul & rezultatul va arata astfel conform tabelului:
Evident rezultatul final este 1.
2.Operatorul de disjunctie
Se noteaza cu | si este un operator binar. Returneaza numarul intreg a carui reprezentare se obtine prin disjunctia bitilor din reprezentarea operanzilor. Din nou o sa va arat clasicul tabel. Vom aplica operatorul | asupra numerelor 15 si 3(reprezentarea lui 15 este 00001111):
Valoare bit 1 | Valoare bit 2 | Rezultat dupa aplicarea | |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
0 | 0 | 0 |
Am ales acest exemplu ca sa vedeti ca mai exista si coincidente la rezultate(in cazul nostru rezultatul este 15)
3.Operatorul “sau exclusiv”
Se noteaza cu ^ si este un operator binar. Returneaza numarul intreg a carui reprezentare se obtine prin operatia or exclusiv asupra bitilor care apar in reprezentarea operanzilor in cod complementar.Din nou,clasicul tabel(aplicam din nou acest operator numarului 15 si 3):
Valoare bit 1 | Valoare bit 2 | Rezultat dupa aplicarea ^ |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
0 | 0 | 0 |
Rezultatul este 12.
4.Operatorii shift left si shift right
Am spus sa ii iau la pachet deoarece fac acelasi lucru dar in directii diferite.Se noteaza cu << (respectiv >>) si returneaza numarul intreg a carui reprezentare se obtine din reprezentarea in cod complementar a primului operand prin deplasare la stanga (respectiv la dreapta) cu un nr de biti egal cu al doilea operand.
Sa luam exemplu numerele 4 si 2.Reprezentarea lui 4 este 00000100. Prin deplasare la stanga se obtine 00010000, care este de fapt numarul 16. Prin deplasare la dreapta se obtine 00000001, care este numarul 1.
Operatorul shift right poate fi asociat cu impartirea intreaga la 2. Operatorul shift left poate fi folosit si pentru a calcula mai rapid numarul 2 la puterea n prin aplicarea lui astfel 1<<n.
Sper ca am fost cat de cat de ajutor. In urmatorul articol o sa vorbim despre operatii la nivel de bit (asta daca mai am timp). Operatorii pe biti sunt folositi deseori in optimizarea programelor deoarece sunt operatii care sunt folosite direct de catre microprocesor. Asa ca puteti da copy paste la codul de mai jos si sa va jucati cu valori.
#include <iostream> using namespace std; int main() { int n,m; cin>>n>>m; cout<<(n & m)<<endl; cout<<(n | m)<<endl; cout<<(n ^ m)<<endl; cout<<(n<<m)<<endl; cout<<(n>>m); return 0;}