Operații pe biți
În memorie, datele sunt reprezentate prin biți. Din această cauză, uneori poate fi necesară sau mai facilă utilizarea unor operații care să impacteze direct biții unei valori.
O variabilă de tip int
este stocată pe 32
de biți, primul bit fiind bitul de semn. Un exemplu este numărul 133
, a cărui reprezentare este 0000000010000101
, cu primul bit 0
, adică numărul este pozitiv. O variabilă de tip long long
este stocată pe 64
de biți după aceeași regulă.
Operatori
Operatorul de shiftare spre stânga <<
Operatorul de shiftare spre stânga mută toți biții numărului spre stânga cu numărul de poziții specificate, inserând 0. Exemplu
1 << 3 == 8 // 1 -> 1000
1 << 6 == 64 // 1 -> 1000000
Pentru a calcula 2^n
putem folosi operația 1 << n
.
Operatorul de shiftare spre dreapta >>
Operatorul de shiftare spre dreapta mută toți biții numărului spre dreapta cu numărul de poziții specificate, inserând 0. Exemplu
8 >> 3 == 8 // 1000 -> 1
5 >> 2 == 1 // 101 -> 1
Operatorul de negație ~
Operatorul de negație dă flip la toate valorile biților. Exemplu
~ 133 == -134 // 133 este 0000000010000101, iar -134 este 1111111101111010
Operatorul de conjucție &
Operatorul de conjuncție, sau după denumirea logică AND
, evaluează fiecare pereche de biți în parte dupa următorul tabel de adevăr.
0 & 0 == 0
0 & 1 == 0
1 & 0 == 0
1 & 1 == 1
Exemplu
5 & 0 == 4
(133 & (1 << 7)) >> 7 == 1 // 133 este 0000000010000101, iar (1 << 7) este 10000000
Operatorul de disjucție |
Operatorul de disjuncție, sau după denumirea logică OR
, evaluează fiecare pereche de biți în parte dupa următorul tabel de adevăr.
0 | 0 == 0
0 | 1 == 1
1 | 0 == 1
1 | 1 == 1
Exemplu
5 | 2 == 7 // 5 este 101, 2 este 10, iar 7 este 111
Operatorul de disjucție exclusivă ^
Operatorul de disjucție exclusivă, sau după denumirea logică XOR
, evaluează fiecare pereche de biți în parte dupa următorul tabel de adevăr.
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
Exemplu
5 ^ 2 == 7 // 5 este 101, 2 este 10, iar 7 este 111
5 ^ 3 == 6 // 5 este 101, 2 este 11, iar 7 este 110