Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Operatori logici la nivel de bit

c



+ Font mai mare | - Font mai mic



Operatori logici la nivel de bit

Ne reintoarcem la cei trei operatori de tip booleean & (AND, I), | (OR, SAU) si ~ (NOT) precum si la un al patrulea operator, denumit SAU-EXCLUSIV ^ (EXCLUSIVE-OR). Acesti operatori se aplica la nivel de bit sau grupuri de biti, dupa tabelele:



x

x

x

1

 

1

1

 

y

0

1

y 0

1

1

y

y

1

0

In C, acesti operatori se aplica in paralel bitilor corespunzatori aflati in orice pozitie. Din aceasta cauza ei se mai numesc si operatori logici pe bit. Trebuie facuta distinctia fata de operatorii logici, care folosesc notatii dublate: &&, ||, sau !. Operatorii logici au aceleasi denumiri, dar ei trateaza intregul operator ca pe o singura valoare, adevarata sau falsa. In scriere, se mai foloseste si denumirea bit-and, bit-or, bit-negate sau exclusive-or.

Ca exemplu, consideram operatia bit-not. Fie numarul binar:

N2 = 0000000000000111 = 0x0007 = 710

Negarea sa pe bit se realizeaza cu instructiunea

~0x7 sau ~07 sau ~7

si valoarea sa va fi

~N2 = 1111111111111000 = 0xFFF8 sau 0177770

pe un computer cu intreg pe 16 biti sau 0xFFFFFFF8 pe un computer cu intreg pe 32 de biti.

Exemplul urmator realizeaza un SAU si un SI pentru doua caractere:

'a' | 'c' = 0110 0001 | 0110 0011 = 0110 0011 = 'c'

'a' & 'c' = 0110 0001 & 0110 0011 = 0110 0010 = 'a'

Deoarece limbajul C a fost gandit sa inlocuiasca limbajul de asamblare in majoritatea operatiilor de programare, acesta trebuie sa aiba capacitatea sa suporte toti (sau cel putin multi) operatorii utilizati in asamblare.

Operatorii pentru prelucrarea bitilor se aplica bitilor    dintr-un byte sau cuvant, ambele variabile de tip char si short int. Acesti operatori nu se aplica tipurilor float, double, long double, void sau altor tipuri mai complexe.

Operatorii pentru prelucrarea bitilor utilizati in C sunt:

&

|

^

~

>>

<<

AND

OR

exclusive OR (XOR)

complement fata de unu (NOT)

deplasare dreapta

deplasare stanga

Operatiile pe biti sunt utilizate de obicei in drivere, pentru testarea si mascarea anumitor biti. De exemplu, operatia AND poate fi folosita pentru stergerea unor biti dintr-un byte sau dintr-un cuvant, OR poate fi folosita pentru setarea unor biti, iar XOR pentru complementarea unor biti si testarea egalitatii a 2 bytes.

Observatie: Operatorii relationali si logici (&&, ||, !,) produc totdeauna un rezultat care este fie 0, fie 1, pe cand operatorii similari destinati prelucrarii bitilor pot produce orice valoare arbitrara, in concordanta cu operatia specifica.

Operatorii >> si << deplaseaza toti bitii dintr-o variabila la dreapta, respectiv la stanga. Forma generala a operatiilor de deplasare este:

variabila >> numar_de_pozitii_bit - pentru deplasare dreapta.

variabila << numar_de_pozitii_bit - pentru deplasare stanga.

In pozitiile ramase libere, dupa deplasare, se introduc zerouri. Operatiile de deplasare pot fi utile cand se decodifica perifericele de intrare cum ar fi convertoarele D/A (digital/analogice) si cand se citesc informatii de stare. Operatorii de deplasare se pot utiliza si pentru realizarea cu rapiditate a operatiilor de inmultire si impartire. Se stie ca o deplasare stanga cu 1 bit realizeaza inmultirea cu 2, iar o deplasare dreapta cu 1 bit realizeaza o impartire cu 2.

Exemplu:

x = 7; 0 0 0 0 0 1 1 1 7

x << 1; 0 0 0 0 1 1 1 0 14

x << 3; 0 1 1 1 0 0 0 0 112

x << 2; 1 1 0 0 0 0 0 0 192

x >> 1; 0 1 1 0 0 0 0 0 96

x >> 2; 0 0 0 1 1 0 0 0 24

Urmatorul exemplu evidentiaza efectul operatorilor de deplasare:

# include <stdio.h>

void disp_binary();

/* prototipul functiei disp_binary() */

void main()

printf (' n');

for (t=0;t<8;t++) }

void disp_binary(int i)

/* se defineste functia disp_binary() */

/* care afiseaza bitii dintr-un byte */

Programul produce urmatoarea iesire:

0 0 0 0 0 0 0 1

0 0 0 0 0 0 1 0

. . . . . . . . . . . .

1 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0

. . . . . . . . . . . .

0 0 0 0 0 0 0 1

Desi limbajul C nu contine un operator de rotire, se poate realiza o functie care sa efectueze aceasta operatie. De exemplu rotirea la stanga cu o pozitie a numarului 10101010 ne conduce la numarul 01010101 si se realizeaza dupa schema:

O posibilitate de realizare a operatiei de rotire necesita utilizarea unei uniuni cu doua tipuri de date diferite. De exemplu utilizand uniunea:

union rotate rot;

Urmatoarea functie realizeaza o rotire cu 1 bit.

void rotate_bit(union rotate *rot)

Atat intregul i cat si cele doua caractere ch[0] si ch[1] partajeaza primii doi octeti din cei 4 rezervati de uniune.

Numarul de rotit se introduce (pe 8 biti) in ch[0]. Se roteste apoi intregul i (deci se rotesc toti cei 4 octeti care ii corespund). Se testeaza MSB al lui ch[0] care se gaseste in urma rotirii in pozitia LSB din ch[1]. Daca este 1, atunci se seteaza la 1 LSB din ch[0], realizandu-se astfel operatia de rotatie.

Un exemplu de program care sa utilizeaze aceasta functie:

# include <stdio.h>

union rotate rot;

void disp_binary();

void rotate_bit();

void main() }

/* se defineste functia rotate_bit() */

void rotate_bit(union rotate *rot)

/* se defineste functia disp_binary() */

void disp_binary(int i)

Acest program realizeaza rotirea numarului cu 6 pozitii

Programul de mai sus functioneaza pentru numere reprezentabile pe un octet (mai mici de 255). Daca dorim sa facem o rotire pe doi octeti, atunci se poate modifica programul de mai sus dupa cum urmeaza:

# include <stdio.h>

union rotate rot;

void disp_binary();

void rotate_bit();

void main() }

/* se defineste functia rotate_bit() */

void rotate_bit(union rotate *rot)

/* se defineste functia disp_binary() */

void disp_binary(int i)

Operatorul ' ~ ' realizeaza complementul fata de 1. O utilizare interesanta a complementului fata de 1 este aceea ca ne permite sa vedem setul caracterelor extinse implementate in calculator:

# include <stdio.h>

# include <conio.h>

void main() while (ch != 'q');}



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1085
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