Operații pe biți
Operațiile pe biți sunt efectuate asupra fiecărui bit al numerelor. În aceste operații, ca operanzi pot fi folosite doar numere întregi.
Fiecare număr are o anumită reprezentare binară. De exemplu, numărul 4 în sistemul binar este 100, iar numărul 5 - 101 și așa mai departe.
De exemplu, să luăm următoarele variabile:
byte b = 7; // 0000 0111
short s = 7; // 0000 0000 0000 0111
Tipul byte ocupă 1 octet sau 8 biți, fiind reprezentat prin 8 poziții binare. Prin urmare, valoarea variabilei b în cod binar va fi 00000111. Tipul short ocupă 2 octeți sau 16 biți, astfel încât numerele de acest tip vor fi reprezentate prin 16 poziții binare. În acest caz, variabila s în sistem binar va avea valoarea 0000 0000 0000 0111.
Pentru a reprezenta numerele cu semn în Java, se utilizează complementul pe doi (two's complement), unde bitul cel mai semnificativ reprezintă semnul. Dacă valoarea acestui bit este 0, numărul este pozitiv, iar reprezentarea sa binară nu diferă de cea a unui număr fără semn. De exemplu, 0000 0001 în sistemul zecimal este 1.
Dacă bitul cel mai semnificativ este 1, atunci avem de-a face cu un număr negativ. De exemplu, 1111 1111 în sistemul zecimal reprezintă -1. La fel, 1111 0011 reprezintă -13.
Operații logice
Operațiile logice asupra numerelor reprezintă operații pe biți. În acest caz, numerele sunt considerate în reprezentare binară, de exemplu, 2 în sistemul binar este 10 și are doi biți, iar numărul 7 - 111 și are trei biți.
- & (și logic)
Înmulțirea se efectuează pe biți, iar dacă ambii biți ai operanzilor sunt egali cu 1, atunci operația returnează 1, în caz contrar returnează 0. De exemplu:
int a1 = 2; //010
int b1 = 5; //101
System.out.println(a1 & b1); // rezultat 0
int a2 = 4; //100
int b2 = 5; //101
System.out.println(a2 & b2); // rezultat 4
În primul caz, avem două numere 2 și 5. 2 în format binar este 010, iar 5 este 101. Înmulțirea pe biți a numerelor (0*1, 1*0, 0*1) dă rezultatul 000.
În al doilea caz, în loc de 2, avem numărul 4, care are 1 pe primul bit, la fel ca și 5, astfel încât rezultatul operației (1*1, 0*0, 0*1) = 100 va fi numărul 4 în format zecimal.
- | (sau logic)
Această operație se efectuează, de asemenea, pe biți, dar acum returnează 1 dacă cel puțin un bit din acel loc este 1 (operația "sau logic"). De exemplu:
int a1 = 2; //010
int b1 = 5;//101
System.out.println(a1 | b1); // rezultat 7 - 111
int a2 = 4; //100
int b2 = 5;//101
System.out.println(a2 | b2); // rezultat 5 - 101
- ^ (sau exclusiv logic)
Această operație este cunoscută și sub denumirea de XOR și este adesea utilizată pentru criptare simplă:
int number = 45; // 1001 Valoarea de criptat - în binar 101101
int key = 102; // Cheia de criptare - în binar 1100110
int encrypt = number ^ key; // Rezultatul va fi 1001011 sau 75
System.out.println("Numărul criptat: " + encrypt);
int decrypt = encrypt ^ key; // Rezultatul va fi numărul inițial 45
System.out.println("Numărul decriptat: " + decrypt);
Operațiile se efectuează, de asemenea, pe biți. Dacă valorile curente ale biților la ambii operanzi sunt diferite, returnează 1, în caz contrar returnează 0. De exemplu, rezultatul expresiei 9^5 va fi 12. Pentru a decripta numărul, aplicăm operația inversă rezultatului.
- ~ (negație logică)
Această operație pe biți inversează toți biții numărului: dacă valoarea unui bit este 1, aceasta devine 0, și invers.
byte a = 12; // 0000 1100
System.out.println(~a); // 1111 0011 sau -13
Operații de deplasare
Operațiile de deplasare se efectuează, de asemenea, asupra biților unui număr. Deplasarea poate avea loc spre dreapta sau spre stânga.
- a<<b - deplasează numărul a spre stânga cu b biți. De exemplu, expresia 4<<1 deplasează numărul 4 (care în binar este 100) cu un bit spre stânga, rezultând 1000 sau 8 în format zecimal
- a>>b - deplasează numărul a spre dreapta cu b biți. De exemplu, 16>>1 deplasează numărul 16 (care în binar este 10000) cu un bit spre dreapta, rezultând 1000 sau 8 în format zecimal
- a>>>b - spre deosebire de tipurile anterioare de deplasare, această operație reprezintă o deplasare fără semn - deplasează numărul a spre dreapta cu b biți. De exemplu, expresia -8>>>2 va fi egală cu 1073741822
Astfel, dacă numărul inițial, care trebuie deplasat într-o direcție sau alta, este divizibil cu doi, atunci, de fapt, obținem o înmulțire sau o împărțire cu doi. Această operație poate fi utilizată în locul înmulțirii sau împărțirii directe cu doi, deoarece operația de deplasare la nivel hardware este mai eficientă decât operația de împărțire sau înmulțire.