Sunteți pe pagina 1din 4

prof.

Emanuela Cerchez

Operaii pe bii

Operatori logici pe bii


Operatorii logici pe bii se aplic numai operanzilor ntregi i au ca efect aplicarea operaiilor logice cunoscute (negaie, conjuncie, disjuncie i disjuncie exclusiv) bit cu bit. Operatorii logici pe bii sunt: Operator Denumire ~ complementariere (negaia pe bii) deplasare stnga, deplasare dreapta <<, >> & conjuncie logic pe bii ^ disjuncie exclusiv pe bii | disjuncie logic pe bii Efectul operatorilor pe bii este: x ~x 0 1 1 0 Tip unar binari binar binar binar Prioritate 2 6 9 10 11

& ^ | 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

prof. Emanuela Cerchez Observaii

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).

Aplicaii cu operaii la nivel de bii


Transformarea unui bit n 1

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

prof. Emanuela Cerchez

Operaii pe bii

Generaliznd, testarea se va realiza prin :


X & (1 << B)

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)

Reprezentarea mulimilor prin vector caracteristic implementat pe bii


Fie n un numr natural (n<VMAX). O metod eficient de a reprezenta o submulime S a mulimii {0, 1, ..., n} este vectorul caracteristic. Mai exact, asociem fiecrui element x din mulimea {0, 1, ..., n} un bit. Bitul corespunztor elementului x are valoarea 1 dac xS, respectiv valoarea 0 dac xS. Descriei funcii care s implementeze operaiile elementare cu mulimi (reuniune, intersecie, diferen, incluziune, test de apartenen) folosind o astfel de reprezentare.

Ciurul lui Eratostene


Fie n un numr natural (n10000). S se genereze toate numerele prime mai mici dect n. Soluie O prim idee ar fi s parcurgem toate numerele naturale din intervalul [2, n], pentru fiecare numr s verificm dac este prim i s afim numerele prime determinate. O idee mai eficient provine in antichitate i poart numele ciurul lui Eratostene1. Ideea este de a pune n ciur toate numerele mai mic dect , apoi de a cerne aceste numere pn rmn n ciur numai numerele prime. Mai nti cernem (eliminm din ciur) toi multiplii lui 2, apoi cernem multiplii lui 3, .a.m.d. Vom reprezenta ciurul ca un vector cu 10000 de componente care pot fi 0 sau 1, cu semnificaia ciur[i]=1 dac numrul i este n ciur i 0 altfel. Vom parcurge vectorul ciur de la 2 (cel mai mic numr prim), pn la n).

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.

prof. Emanuela Cerchez

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

S-ar putea să vă placă și