Sunteți pe pagina 1din 7

PROGRAMAREA CALCULATOARELOR

LUCRAREA NR. 6

OPERATORI PENTRU LUCRU LA NIVEL DE BIT


Limbajul C ofer un numr de operatori pentru lucrul la nivel de bit. Aceti operatori
se aplic numai variabilelor de tip int i char i conduc la expresii ale cror rezultate
depind de reprezentarea intern a ntregilor i au caracteristici care depind de
implementarea tipurilor cu semn.
Operatorii binari de lucru la nivel de bit sunt:
<<

deplasare stnga cu un anumit numr de bii

>>

deplasare dreapta cu un anumit numr de bii

&

I (AND) la nivel de bit;

SAU EXCLUSIV (XOR) la nivel de bit;

SAU (OR) la nivel de bit.

n afar de aceti operatori binari, limbajul ne mai pune la dispoziie un operator unar
care permite determinarea complemetului fa de 1 al operandului. Acest operator este ~
i are aceeai prioritate ca i ceilali operatori unari existeni n limbaj.
Operatorii &, ^ i | sunt folosii, de obicei, pentru a realiza operaiile dorite asupra
primului operand n conformitate cu o configuraie de bii indicat de cel de-al doilea
operand. Din acest motiv, de foarte multe ori, cel de al doilea operand mai este numit i
masc pentru c nu face dect s mascheze anumii bii din primul operand. Aceti
operatori se aplic fiecrui bit din reprezentarea intern (binar, n virgul fix) a
numrului.
Operatorii de deplasare << i >>
<< Deplaseaz la stnga numrul din stnga operatorului cu un numr de poziii egal
cu numrul existent n dreapta operatorului.
Exemplu: rezultatul expresiei
n << 3
este valoarea numrului n deplasat cu 3 (trei) poziii la stnga.
Deplasarea la stnga completeaz poziiile rmase libere cu zerouri. Deplasarea cu
o poziie a numrului n este echivalent cu o nmulire cu 2 a valorii iniiale a numrului n
i n exemplu dat (n<<3) expresia este echivalent cu n * 2 * 2 * 2.

PROGRAMAREA CALCULATOARELOR

LUCRAREA NR. 6

>> Deplaseaz la dreapta numrul din stnga operatorului cu un numr de poziii


egal cu numrul existent n dreapta operatorului.
Exemplu: rezultatul expresiei
n >> 3
este valoarea numrului n deplasat cu 3 (trei) poziii la dreapta.
Deplasarea spre dreapta completeaz poziiile rmase libere cu o extensie a
semnului (dac numrul este pozitiv, completarea se face cu zero; dac numrul este
negativ completarea se face cu 1). Deplasarea la dreapta cu un bit (o poziie) este
echivalent cu o mprire la 2 a numrului iniial. Astfel n exemplul considerat expresia
n>>3 este echivalent cu expresia n/(2*2*2).
n cazul n care considerm n fiind un ntreg reprezentat pe 2 octei (de tip short int)
i a crui valoare este 38, reprezentarea sa intern este urmtoarea:
15 14 13 12 11 10 9
0 0 0 0 0 0 0

8
0

7
0

6
0

5
1

4
0

3
0

2
1

1
1

0
0

Dup deplasarea cu trei poziii la stnga, coninutul celor doi octei asociai variabilei
n are urmtoarea reprezentare binar:
15 14 13 12 11 10 9
0 0 0 0 0 0 0

8
1

7
0

6
0

5
1

4
1

3
0

2
0

1
0

0
0

Rezultatul deplasrii spre dreapta cu trei poziii a valorii iniiale a variabilei n are
urmtoarea reprezentare binar:
15 14 13 12 11 10 9
0 0 0 0 0 0 0

8
0

7
0

6
0

5
0

4
0

3
0

2
1

1
0

0
0

Operatorul & (I)


Lucreaz dup urmtorul tabel de adevr:
&

i este folosit pentru a pune pe zero (a reseta) anumii bii din variabila luat n considerare
(biii respectivi se terg). Datorit acestui mod de lucru, folosirea operatorului & permite
scoaterea n eviden a biilor care ne intereseaz.
Exemple:
a). c = n & 0100;

PROGRAMAREA CALCULATOARELOR

LUCRAREA NR. 6

pune pe zero toi biii lui n mai puin bitul 6 (numerotarea ncepe de la 0 (zero) i din
dreapta) care rmne la valoarea iniial.
n = 6710 = 26 + 21 + 20 = 010000112 = 01038
c = n & 01008 = 01038 & 01008 = 01008
b). c = n & 01774008 = n & 11111111
1424
3 00000000
1424
3 2;
octet superior

octet inferior

face octetul inferior egal cu zero, cel superior rmne neschimbat;


c). c = n & 03778 = n & 00000000
1424
3 2;
1424
3 11111111
octet superior octet inferior

face octetul superior egal cu zero, cel inferior rmnnd la fel ca n n.

Operatorul | (SAU)
Lucreaz dup urmtorul tabel de adevr:
|

i este folosit pentru a pune pe 1 (unu) (a seta) toi biii care au valoarea 1 n "masc".
Exemplu:
z = x | MASK;
x = 6610; MASK = 0118;
z = 6610 | 0118 = 01028 | 0118 = 01138 = 7510
x = 6610; MASK = 0778;
z = 6610 | 0778 = 01028 | 0778 = 01778 = 12710
x = 6610; MASK = 6810;
z = 6610 | 6810 = 01028 | 01048 = 010000102 | 010001002 = 010001102 =
01068 = 7010
Operatorii pe bii & i | sunt diferii de operatorii logici && i ||. Operatorii logici
implic o evaluare de la stnga la dreapta a valorii de adevr a expresiilor implicate, pe
cnd operatorii care lucreaz pe bit execut operaiile ca n algebra Boolean.
Exemplu: x = 1; y = 2 x&y = 0, pe cnd x&&y = 1.

PROGRAMAREA CALCULATOARELOR

LUCRAREA NR. 6

Operatorul ^ (SAU EXCLUSIV XOR)


Lucreaz n conformitate cu tabelul de adevr urmtor:
^

Operatorul unar ~
Aplicarea acestui operator are ca rezultat complementul fa de 1 al operandului (biii
egali cu zero devin unu i cei egali cu unu devin zero).
Exemplu, n instruciunea:
x = x & ~077;
este folosit pentru complementarea valorii octale 077 i astfel putem realiza resetarea
(punerea pe zero) a ultimilor 6 bii ai lui x.
Exemple:
a).

x = 6610

i ~077 = 1111111111000000 = 1777008, deci

x = 6610 & ~077 = 01028 & 1777008 = 01008


b)

~1234 = ~00000100110100102 = 11111011001011012 = 01754558


~-1234 = ~ 11111011001011102 = 00000100110100012 = 023218
-~1234 = -11111011001011012 = 0000010011010011 = 023238

TEMA
n cele ce urmeaz se vor folosi numai operatori de lucru pe bit pentru toate
operaiile cerute.
Se consider c bitul cel mai semnificativ al unui numr este bitul din stnga,
iar cel mai puin semnificativ este cel din dreapta.
Problema nr. 1
S se scrie un program care realizeaz rotirea la dreapta sau la stnga (n funcie de
opiunea utilizatorului) cu un anumit numr de bii a unui numr ntreg lung.
Se vor scrie funcii de rotire dreapta, rotire stnga, i afiare bit cu bit (afiarea se va
face astfel nct bitul cel mai semnificativ s apar n partea stng a reprezentrii).

PROGRAMAREA CALCULATOARELOR

LUCRAREA NR. 6

Problema nr. 2
S se scrie o funcie care are ca parametri un numr ntreg i un numr real i
returneaz un numr real i care realizeaz ridicarea unui numr oarecare la o putere
ntreag, folosind urmtorul algoritm cu aplicarea operatorilor de lucru pe bit:
Observaie: orice numr ntreg se poate exprima n baza 2.
De exemplu 2310 = 101112 = 24 + 22 + 21 + 20.
Pentru ridicarea unui numr a la puterea 23 se poate face urmtorul calcul:
a23 = a(16 + 4 + 2 + 1) = a16 a4 a2 a1
Ca urmare, pentru ridicarea unui numr la o putere ntreag trebuie s se genereze
un ir care va include valorile a avnd ca exponeni puteri ale lui 2, adic trebuie s se
genereze urmtorul ir:
a, a2, a4, a8, a16, a32, ..
Termenii acestui ir se genereaz printr-un numr relativ mic de operaii, astfel:
f = a;
f = f * f;
innd cont de observaia de mai sus, an se poate calcula fcnd apel la termenii
acestui ir, alegndu-i numai pe aceea ai cror exponeni nsumai dau puterea n. Pentru
aceasta se face operaia n&1, i dac rezultatul este 1, primul termen este a. Se
deplaseaz n spre dreapta cu o poziie. Dac n&1=1, se selecteaz a2, s.a.m.d.
S se scrie un program care citete un numr real i un numr ntreg i afieaz
rezultatul ridicrii numrului real la numrul ntreg.
Problema nr. 3
Cea mai simpl verificare a corectitudinii transmiterii unui ir de bii este s ne
asigurm c numrul biilor egali cu 1 din irul de bii este par sau impar. Pentru a realiza
acest lucru se ataeaz respectivului ir de bii un bit numit bit de paritate. Folosirea biilor
de paritate este cea mai simpl form de "cod de detectare a erorilor" folosit pentru
verificarea corectitudinii transmiterii unui mesaj n form binar.
Sunt dou variante de bii de paritate: bit de paritate par i bit de paritate impar.
Cnd se utilizeaz paritatea par, bitul de paritate este setat pe 1 dac numrul de bii
egali cu 1 dintr-un ir de bii (neincluznd bitul de paritate) este impar astfel nct numrul
total de bii (incluznd bitul de paritate) s fie par. Cnd se utilizeaz paritatea impar, bitul
de paritate este setat pe 1 dac numrul de bii egali cu 1 dintr-un ir de bii (neincluznd
bitul de paritate) este par astfel nct numrul total de bii (incluznd bitul de paritate) s fie
impar.

PROGRAMAREA CALCULATOARELOR

LUCRAREA NR. 6

Paritatea par este un caz particular de cod CRC (Cyclic Redundacy Check) care
este un cod de detectare a erorilor.
S se scrie un program care determin bitul de paritate par asociat unui numr
ntreg lung citit de la tastatur i l nscrie n bitul cel mai semnificativ (bitul de paritate va fi
1 sau 0 dup cum numrul biilor egali cu 1 din ceilali 31 de bii este impar sau par). De
asemenea, operatorii de lucru pe bit se vor folosi pentru a determina dac un numr este
par sau nu (cum?). Se va afia numrul iniial i reprezentarea binar a numrului cu
paritatea setat.
Problema nr. 4
S se scrie o funcie care folosind numai operatori de lucru pe bit calculeaz
valoarea n octal a unui numr ntreg primit ca parametru i o depune ntr-un ir de
caractere primit ca al doilea parametru. Numrul octal este reprezentat ntr-un ir de
caractere (care este al doilea parametru al funciei) i este precedat de caracterul 0. Se va
ine seama de faptul c o cifr octal poate fi reprezentat pe 3 bii.
S se scrie o funcie care folosind numai operatori de lucru pe bit calculeaz
valoarea n hexazecimal a unui numr ntreg primit ca parametru i o depune ntr-un ir de
caractere primit ca al doilea parametru. Numrul hexazecimal este reprezentat ntr-un ir
de caractere (care este al doilea parametru al funciei) i este precedat de caracterele 0x.
Se va ine seama de faptul c o cifr hexazecimal poate fi reprezentat pe 4 bii.
S se scrie un program care citete de la tastatur un ntreg fr semn i folosind
cele dou funcii de mai sus, afieaz reprezentarea hexazecimal sau octal a numrului.
Opiunea de afiare este dat de utilizator.
Problema nr. 5
S se scrie un program care folosete numai operatorii de lucru la nivel de bit pentru
a realiza mpachetarea unei date calendaristice ntr-un ntreg de doi octei (astfel biii 0-4
reprezint ziua, biii 5-8 reprezint luna, biii 9-15 reprezint anul numrat de la 1900) i
afiarea reprezentrii binare a rezultatului.
ATENIE: NU se folosesc vectori.
Se va defini tipul de dat WORD ca sinonim pentru ntreg scurt fr semn.
Data se citete sub forma: zz/ll/aaaa.
Se vor scrie obligatoriu funcii pentru: mpachetare dat, afiare binar.

PROGRAMAREA CALCULATOARELOR

LUCRAREA NR. 6

Problema nr. 6
S se scrie un program care determin i afieaz toate numerele prime inferioare
unui numr dat (prestabilit), folosind ciurul lui Eratostene. Metoda const din eliminarea
succesiv a numerelor neprime prin parcurgerea urmtorilor pai:
1. Se elimina numrul 1 (prin definiie nu este prim).
2. Apoi se caut (pornind de la ultimul numr prim considerat - iniial 1) primul numr
neeliminat (acesta este prim) i se elimina toi multiplii si (din intervalul 1-n).
3. Se repet pasul 2 pn cnd numrul prim considerat este mai mare dect sqrt(n)
adic radical din n. Funcia sqrt are prototipul n math.h.
Pentru rezolvare nu se vor folosi vectori, fiecrui numr natural fiindu-i asociat un bit
a crei valoare este 1 dac numrul este prim i 0 dac numrul nu este prim.
Problema nr. 7
S se scrie o funcie care, folosind numai operatori de lucru pe bit, verific dac un
numr natural este o putere a lui 2 (un numr natural este o putere a lui 2 dac, n
reprezentare binar, numrul are exact un bit egal cu 1). Funcia primete ca parametru
numrul de analizat i returneaz 1 sau 0 dup cum numrul este sau nu putere a lui 2.
(NU se vor folosi operatorii aritmetici "/" sau "%").
S se scrie o funcie care, folosind numai operatori de lucru pe bit, inverseaz cei doi
octei ai unui numr ntreg reprezentat pe doi octei. Funcia primete ca parametru un
numr ntreg i returneaz numrul cu octeii inversai. (NU se vor folosi operatorii
aritmetici "/" sau "%").
S se scrie o funcie care primete ca parametri un vector de ntregi i dimensiunea
acestui vector. Funcia asociaz fiecrui element din vector un bit dintr-un ntreg i pune
bitul respectiv pe 1 dac elementul are o valoare par i pe 0 dac elementul respectiv are
o valoare impar i returneaz numrul astfel construit. (NU se vor folosi operatorii
aritmetici "+", "-", "*", "/" sau "%").
S se scrie un program care face una din prelucrrile de mai sus, n funcie de
alegerea utilizatorului.

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