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