CATEGORII DOCUMENTE |
OPERATORI DE PRELUCRARE LA NIVEL DE BIT
1. SCOPUL LUCRARII
In aceasta lucrare se studiaza o parte din operatorii de prelucrare la nivel de bit, ai limbajului C, si anume:
& SI la nivel de bit
SAU la nivel de bit
SAU EXCLUSIV la nivel de bit
NEGARE la nivel de bit
<< DEPLASARE STANGA la nivel de bit
>> DEPLASARE DREAPTA la nivel de bit
2. BREVIAR TEORETIC
In programarea interfetelor electronice este adesea necesar sa prelucram datele la nivel de bit. Limbajul C este un limbaj adecvat pentru dezvoltarea de sisteme electronice si datorita faptului ca are un set bogat de operatori de prelucrare la nivel de bit si anume:
& (operatorul SI)
(operatorul SAU)
(operatorul SAU EXCLUSIV)
(operatorul NEGARE)
<< (operatorul DEPLASARE STANGA)
>> (operatorul DEPLASARE DREAPTA)
Toti acesti operatori, cu exceptia operatorului ~ (negare), sunt operatori binari, adica au doi operanzi. In general cand se studiaza operatori noi, acestia trebuie studiati si cu prioritatea lor. Astfel, operatorul SI este mai prioritar (leaga mai puternic) decat SAU EXCLUSIV, si acesta este mai prioritar decat operatorul SAU. Acest grup de operatori (&, |, ^) au prioritate mai mica decat a operatorilor relationali, dar mai mare decat a operatorilor logici (&&, ||). Pentru evitarea memorarii acestor prioritati se recomanda folosirea parantezelor in expresiile ce contin operatori.
2.1. Operatorul SI la nivel de bit
Simbol: &
Exemplu:
unsigned char i,j;
j=i & 0x0F;
Descriere:
Se realizeaza operatia SI intre bitii corespondenti, conform tabelei de adevar cunoscute:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
2.2. Operatorul SAU la nivel de bit
Simbol: |
Exemplu:
unsigned char i,j;
j=i | 0x0F;
Descriere:
Se realizeaza operatia SAU intre bitii corespondenti, conform tabelei de adevar cunoscute:
2.3. Operatorul SAU EXCLUSIV la nivel de bit
Simbol: ^
Exemplu:
unsigned char i,j;
j=i ^ 0x0F;
Descriere:
Se realizeaza operatia XOR intre bitii corespondenti, conform tabelei de adevar cunoscute:
^ 1 = 1
2.4. Operatorul NEGARE la nivel de bit
Exemplu:
unsigned char i,j;
j=~i;
Descriere:
Are ca efect inversarea (complementarea) bitilor corespondenti, conform tabelei cunoscute:
2.5. Operatorul DEPLASARE STANGA la nivel de bit
Exemplu:
unsigned char i,j;
j=i << 2;
Descriere:
Se shifteaza toti bitii primului operand, spre stanga, cu un numar de pozitii dat de al doilea operand (in cazul exemplului, cu 2 pozitii). Din partea dreapta 'intra' in numarul rezultat, biti de valoare 0.
2.6. Operatorul DEPLASARE DREAPTA la nivel de bit
Exemplu:
unsigned char i,j;
j=i >> 2;
Descriere:
Se shifteaza toti bitii primului operand, spre dreapta, cu un numar de pozitii dat de al doilea operand (in cazul exemplului, cu 2 pozitii). Din partea stanga 'intra' in numarul rezultat, biti de valoare 0 (in cazul numerelor intregi pozitive), sau biti de valoare 1 in cazul numerelor cu semn negative (reprezentate in complement fata de 2).
3. DESFASURAREA LUCRARII
Se vor edita si apoi executa programele descrise in continuare.
Programul nr. 1
Sa se afiseze valoarea in baza 10 a tuturor octetilor ce au bitii 0, 2 si 5 egali cu 1 (restul bitilor pot fi 0 sau 1).
Masca folosita in operatia de testare va avea bitii 5, 2, 0 de valoare 1, iar restul bitilor sunt 0. Deci, in binar, masca pentru operatorul SI, va fi: 0010.0101. In baza 16, aceasta masca are valoarea: 0x25 .
#include <stdio.h>
#include <conio.h>
void main(void)
Programul nr. 2
Sa se scrie o functie ce returneaza msb-ul (cel mai semnificativ bit) si lsb-ul (cel mai putin semnificativ) dintr-un octet.
#include <stdio.h>
#include <conio.h>
void msb_lsb(unsigned char b, unsigned char * adrMsb,
unsigned char * adrLsb);
void main(void)
void msb_lsb(unsigned char b, unsigned char * adrMsb,
unsigned char * adrLsb)
Programul nr. 3
Sa se scrie o functie ce are ca argumente de intrare doi octeti, b1 si b2. Functia returneaza 1 daca b1 si b2 au acelasi numar de biti de 1, si returneaza 0 in caz contrar.
Exemplu: Daca b1=1 si b2=2, valoarea returnata este 1.
#include <stdio.h>
#include <conio.h>
int nr_biti_1(unsigned char b);
int compara(unsigned char b1, unsigned char b2);
void main(void)
int compara(unsigned char b1, unsigned char b2)
int nr_biti_1(unsigned char b)
int i;
n1=0;
for(i=0;i<8;i++)
if( (b&masca[i])!=0 )n1++;
return n1;
Programul nr. 4
Se da un octet b. Sa se calculeze si afiseze care este cel mai mare numar ce se poate obtine aranjand in alta ordine bitii octetului b.
Exemplu: b=6 (in binar 0000.0110). Numarul maxim este max=192 (in binar 1100.0000)
#include <stdio.h>
#include <conio.h>
#include <math.h>
int nr_biti_1(unsigned char b);
void main(void)
int nr_biti_1(unsigned char b)
int i;
n1=0;
for(i=0;i<8;i++)
if( (b&masca[i])!=0 )n1++;
return n1;
Programul nr. 5
Se citesc 2 octeti a si b de la tastatura. Sa se permute prin program urmatorii 4 biti intre cei 2 octeti:
Inainte de permutare:
a: a7 a6 a5 a4 a3 a2 a1 a0
b: b7 b 5 b4 b3 b2 b1 b0
Dupa permutare:
a: a7 a6 a5 a4 b3 b2 b1 b0
b: b7 b6 b5 b4 a3 a2 a1 a0
#include <stdio.h>
#include <conio.h>
void main(void)
Programul nr. 6
Sa se scrie o functie ce are ca parametru de intrare un numar intreg fara semn. Functia returneaza valoarea complementata (bit cu bit) a celui mai semnificativ octet din numar.
#include <stdio.h>
#include <conio.h>
unsigned char complementareOctet(unsigned int nr);
void main(void)
unsigned char complementareOctet(unsigned int nr)
Programul nr. 7
Folosind operatorii de shiftare, sa se scrie o functie ce returneaza suma bitilor de valoare 1 dintr-un octet.
#include <stdio.h>
#include <conio.h>
int suma(unsigned char b);
void main(void)
int suma(unsigned char b)
return s; }
Programul nr. 8
Se citeste un octet de la tastatura, caruia i se va calcula paritatea. La acest octet se va adauga bitul de paritate, astfel incat per ansamblu, paritatea cuvantului rezultat sa fie para. Se va construi deci un cuvant (16 biti), in care cel mai putin semnificativ octet este octetul citit, iar restul de 8 biti se obtin astfel:
BIT8 = 0 daca paritatea octetului citit este para
BIT8 = 1 daca paritatea octetului citit este impara
BIT9BIT15 = 0
In final se va afisa in format binar cuvantul construit.
#include <stdio.h>
#include <conio.h>
unsigned int makeParitate(unsigned char b);//returneaza cuvintul obtinut /din byte-ul b prin adaugare bit de paritate
int paritate(unsigned char b);//returneaza paritatea octetului b
void convertWord(unsigned int w,int A[]);//converteste cuvintul w in
//reprezentarea lui binara (16 biti, memorati in vectorul A)
void afisareCuvintInBinar(unsigned int w);//afiseaza cei 16 biti ai lui // w
void main(void)
while(!stop);
unsigned int makeParitate(unsigned char b)
int paritate(unsigned char b)
//for
if ((nr_1 % 2)==0)return 1; //paritate para
else return 0;
void afisareCuvintInBinar(unsigned int w)
void convertWord(unsigned int w,int A[])
//MASCA[0] este pentru obtinerea lsb.
for(i=0;i<16;i++)
if( (w & MASCA[i]) ==0)A[i]=0;
else A[i]=1;
Programul nr. 9
Sa se scrie o functie in care se realizeaza, pentru un octet, rotirea spre dreapta cu un bit.
Astfel daca reprezentarea binara a octetului este: b7 b6 b5 b4 b3 b2 b1 b0, dupa rotire se obtine b0 b7 b6 b5 b4 b3 b2 b1 .
#include <stdio.h>
#include <conio.h>
void r_dreapta(unsigned char * b);
void main(void)
void r_dreapta(unsigned char * b)
Programul nr. 10
Sa se scrie o functie ce permuta bitii de pe pozitiile i si j ai unui octet.
#include <stdio.h>
#include <conio.h>
void comuta_ij(unsigned char * b, int i, int j);
void main(void)
void comuta_ij(unsigned char * b, int i, int j)
4. PROBLEME PROPUSE
1. Sa se afiseze paritatea unui numar intreg fara semn, citit de la tastatura. Se va defini pentru acest scop functia paritate care are ca intrare un numar intreg fara semn si care returneaza 1, daca paritatea numarului este para, sau 0 , daca paritatea lui este impara.
2. Sa se scrie o functie in care se comuta bitii i si j dintr-un intreg fara semn.
3. Sa se scrie o functie in care se incarca toti bitii dintr-un octet b, intr-un vector A. Octetul b si vectorul A, se transmit functiei ca argumente.
4. Sa se scrie o functie ce are ca intrare un vector de 8 biti (msb-ul pe prima pozitie). Functia returneaza valoarea calculata a octetului corespunzator.
Exemplu: A=. Va returna 23.
5. Sa se scrie o functie ce are ca intrare un octet si returneaza un string ce contine reprezentarea binara a octetului respectiv.
Exemplu: octet=23;
6. Fie w, un numar intreg fara semn. Sa se calculeze si afiseze care este cel mai mare numar ce se poate obtine aranjand in alta ordine bitii numarului w.
Exemplu:
w=6 (in binar: 0000.0000.0000.0110).
Numarul maxim este: max = 1100.0000.0000.0000 (in binar)
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1252
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved