Documente Academic
Documente Profesional
Documente Cultură
Emanuela Cerchez
Operaii pe bii
& ^ | 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 Operatorii de deplasare au ca efect deplasarea reprezentrii binare a primului operand spre stnga (<<) sau spre dreapta (>>). Numrul de poziii care se deplaseaz este specificat de cel de-al doilea operand. La deplasarea la stnga, poziiile rmase libere n dreapta se completeaz cu 0. La deplasarea la dreapta, poziiile rmase libere n stnga se completeaz cu 0 (dac operandul stng este un ntreg pozitiv) sau cu 1 (dac operandul este ntreg negativ). Exemple S considerm urmtoarele declaraii de variabile:
int n=3, a=0X1F8A, b=0XF0F5;
Pentru a determina cu uurin reprezentrile n memorie ale variabilelor a i b, am exprimat valorile lor n hexazecimal. Reprezentarea n memorie a acestor variabile este:
a= b= ~a= a&b= a^b= a|b= a>>3= a<<3= 0
15
0
14
0
13
1
12
1
11
1
10
1
9
1
8
1
7
0
6
0
5
0
4
1
3
0
2
1
1
0
0
1
15
1
14
1
13
1
12
0
11
0
10
0
9
0
8
1
7
1
6
1
5
1
4
0
3
1
2
0
1
1
0
1
15
1
14
1
13
0
12
0
11
0
10
0
9
0
8
0
7
1
6
1
5
1
4
0
3
1
2
0
1
1
0
0
15
0
14
0
13
1
12
0
11
0
10
0
9
0
8
1
7
0
6
0
5
0
4
0
3
0
2
0
1
0
0
1
15
1
14
1
13
0
12
1
11
1
10
1
9
1
8
0
7
1
6
1
5
1
4
1
3
1
2
1
1
1
0
1
15
1
14
1
13
1
12
1
11
1
10
1
9
1
8
1
7
1
6
1
5
1
4
1
3
1
2
1
1
1
0
0
15
0
14
0
13
0
12
0
11
0
10
1
9
1
8
1
7
1
6
1
5
1
4
0
3
0
2
0
1
1
0
1
15
1
14
1
13
1
12
1
11
1
10
0
9
0
8
0
7
1
6
0
5
1
4
0
3
0
2
0
1
0
0
Dac a ar fi fost declarat de tip unsigned, prin deplasare la dreapta, s-ar obine acelai rezultat, deoarece valoarea lui a este pozitiv (bitul semn este 0). Valoarea lui b este negativ (bitul 15 bitul semn este 1), prin deplasare la dreapta se propag semnul, deci se completeaz cu 1.
b>>3= 1
15
1
14
1
13
1
12
1
11
1
10
1
9
0
8
0
7
0
6
0
5
1
4
1
3
1
2
1
1
0
0
Operaii pe bii
1. Expresia x<<n are ca efect nmulirea operandului x cu 2n. Expresia x>>n are ca efect mprirea ntreag a operandului x cu 2n. 2. Operaiile care se efectueaz pe bii (deci acioneaz direct asupra reprezentrii interne a operanzilor) sunt foarte performante (se execut foarte rapid).
Pornim de la valoarea ntreag X=50. Reprezentarea acestuia pe 8 bii este 00110010. Presupunem c dorim setarea bitului 2 la valoarea 1. Pentru aceasta vom folosi o masc logic n care doar bitul 2 este 1 restul biilor fiind 0, adic M=00000100. Valoarea lui M este 1 shl 2 (22). Operaia de disjuncie SAU aplicat asupra lui X i a lui M, conduce la obinerea rezultatului dorit. X 00110010 | M 00000100 Rez 00110110 Generaliznd, dac se dorete ca valorii X, s i se seteze la valoarea 1, bitul B (0B7), atunci masca logic este 1 shl B. X | (1 << B)
Transformarea unui bit n 0
S lum ca exemplu X= 109, pentru a vedea cum se seteaz un bit la valoarea 0. Reprezentarea intern a lui este 01101101. Se cere s se seteze bitul 5 la valoarea 0. De data aceasta masca va conine toi biii de 1, excepie bitul 5. Aspura lui X i M vom aplica I logic. X M 01101101 & 11011111
Rez 01001101
Presupunem c dorim s setm la 0 valoarea bitului B (0B7). X & ~(1 << B) Testarea valorii unui bit Plecm de la valoarea X=47. Reprezentarea intern a lui este 00101111. Presupunem c dorim s cunoatem valoarea bitului 3 i bitului 6. Vom folosi mtile M1=00001000 i M2=01000000. Vom aplica de fiecare dat I logic ntre X i cele dou mti: X 00101111 & M1 00001000 Rez 00001000 Respectiv X 00101111 & M2 01000000
Rez 00000000 2
Operaii pe bii
Testarea valorilor ultimilor bii Pornim de la valoarea ntreag X=50. Reprezentarea acestuia pe 8 bii este 00110010. Presupunem c dorim s cunoatem restul la mprirea ntreag a lui X la 8, adic x%8. Valoarea ultimilor 3 bii din reprezentarea intern a lui, reprezint tocmai acest rest. Pentru aceasta vom folosi o masc n care ultimii trei biii sunt 1 restul 0. Aceasta masc are valoarea 7, adic 00000111. Vom aplica operaia I logic. X M 00110010 & 00000111
Rez 00000010
Pe caz general, dac dorim s cunoatem valoarea ultimilor B bii (care este egal cu restul mpririi lui X la 2B) vom exprima astfel: X & (1 << B1)
1. Eratostene (276196 .e.n) a fost un important matematician i filosof al antichitii. Dei puine dintre lucrrile lui s-au pstrat, a rmas celebru prin metoda rapid de determinare a numerelor prime i prin faptul c a fost primul care a estimat cu acuratee diametrul Pmntului.
Operaii pe bii
Dac ciur[i] este 1 deducem c i este prim, dar toi multiplii lui nu vor fi (deci eliminm din ciur toi multiplii lui i). n final n vectorul ciur vor avea valoarea 1 doar componentele de pe poziii numere prime.
#include <iostream.h> #define NMax 10000 int main() {int ciur[NMax], n, i, j; cout<<"n= "; cin>>n; //initial toate numerele sunt in ciur for (i=2; i<n; i++) ciur[i]=1; for (i=2; i*i<=n; i++) if (ciur[i])//i este prim //elimin toti multiplii lui i for (j=2; j*i<n; j++) ciur[i*j]=0; for (i=2; i<n; i++) if (ciur[i]) cout<<i<<' '; return 0; }
Aplicaii
1. Implementai ciurul lui Eratostene utiliznd ciurul reprezentat ca vector caracteristic implementat pe bii! 2. Scriei o funcie care determin numrul de cifre de 1 din reprezentarea binar a unui numr natural nenul n mai mic ca 2000000000. 3. Scriei o funcie care identific cea mai mare putere a lui 2 care l divide pe n, unde n este numr natural nenul. (Problema se reduce la determinarea celui mai nesemnificativ bit de 1 din reprezentarea binar a lui n) 4. Cod http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=163 5. Paritate http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=843
Bibliografie E. Cerchez, M. erban - Programarea n limbajul C/C++. Volumul I. Editura Polirom D. Lica - Operaii pe bii http://campion.edu.ro/arhiva/index.php?page=paper&action=view&id=21