Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


OPERATORI DE PRELUCRARE LA NIVEL DE BIT

c



+ Font mai mare | - Font mai mic



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

Simbol: ~

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

Simbol: <<

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

Simbol: >>

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 .

Sursa programului:

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

Sursa programului:

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

Sursa programului:

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

Sursa programului:

#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

Sursa programului:

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

Sursa programului:

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

Sursa programului:

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

Sursa programului:

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

Sursa programului:

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

Sursa programului:

#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;

Scoate ca rezultat sirul: '00010111'

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1162
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved