Matematica booleana - operatii logice
Scris de Agkelos
Matematica booleana e cel mai folosit tip de matematica din programare. Multi programatori (amatori) nici macar nu sunt constienti ca o folosesc, dar adevarul e ca nu exista parte a matematicii mai folosita decat matematica booleana. Intr-un sistem de calcul - fie desktop, workstation, server sau orice altceva - totul se bazeaza pe matematica boolean. Procesorul, sufletul sistemului de calcul, nu face altceva decat operatii booleene. La fel orice alta parte a sistemului de calcul are la baza matematica booleana.
Sa vedem ce e cu matematica asta si la ce e buna. Cum probabil ati auzit/citit totul intr-un sistem de calcul se bazeaza pe doua valori: 1 sau 0. Valorile astea pot fi interpretate in diferite moduri si pot fi aplicate peste tot. De fapt, matematica booleana nu se aplica doar in cazul sistemelor de calcul. Se aplica peste tot unde pot fi puse conditii logice si peste tot unde intreaga problema se poate rezuma la doua valori: true sau false, 1 sau 0, activ sau inactiv. Pentru o mai usoara intelegere voi folosi mai departe valorile 0 si 1, dar in functie de caz le puteti schimba cu true/false sau on/off.
Matematica booleana are trei operatori: AND (si logic), OR (sau logic), NOT (negare). Chestiile complexe de care probabil ati auzit - NAND, NOR, XOR - sunt de fapt combinatii ale acestor trei operatii logice. OK, hai sa vedem ce face fiecare operatie.
AND
Operatorul AND sau “si logic” este folosit pentru a verifica simulat doua conditii. Pentru a fi mai usor ganditi-va la o teava cu doi robineti montati in serie (unul dupa celalalt). Pe noi ne intereseaza sa aflam daca la capatul tevii curge apa. Conditia ca apa sa curga e ca ambii robineti sa fie deschisi ( 1 ). Fie A primul robinet si B al doilea robinet. Daca ambii robineti au valoarea 1 (adica sunt deschisi) apa curge. Daca unul din robineti (oricare din ei) e oprit, apa nu curge. Asta e o operatie AND. Daca unul din robineti este inchis, apa nu curge. Daca ambii sunt deschisi apa curge.
Logic (boolean) treaba asta poate fi exprimata in felul urmator:
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Usor de inteles, nu ? Daca ambele valori sunt 0 (robinetii sunt inchisi) rezultatul va fi 0 (apa nu curge). Daca unul din robineti e deschis ( 1 ) iar celalalt e inchis ( 0 ) rezultatul va fi 0 pentru ca nu are cum sa curga apa. Daca ambii robineti sunt deschisi (ambii au valoarea 1) rezultatul e 1, adica apa curge. Dupa cum se vede singurul caz in care operatorul AND returneaza 1 este cel in care toate conditiile sunt satisfacute, adica toate valorile sunt 1. Daca o singura valoare este 0, operatorul AND va returna 0.
OR
Al doilea operator logic este OR, numit si “sau logic”. Operatorul OR ne ajuta cand sunt mai multe conditii dar pe noi ne intereseaza sa fie cel putin una din conditii satisfacuta. Ca sa revin cu un exemplu asemanator cu cel mai sus ganditi-va la doua tevi si pe fiecare teava cate un robinet. Pe fiecare teava daca robinetul e inchis nu curge apa iar daca e deschis curge. Operatorul OR ne spune cand cel putin unul din cei doi robineti e deschis. Logic arata in felul urmator:
1 OR 0 = 1
0 OR 1 = 1
1 OR 1 = 1
Adica, daca primul sau al doilea element au valoarea 1, rezultatul va fi 1 pentru ca folosim operatorul OR care ne spune cand se indeplineste o conditie din cele cerute, indiferent care ar fi conditia respectiva. Deci, singurul caz in care operatorul OR returneaza 0 este atunci cand toate valorile sunt 0. In caz contrar returneaza 1.
NOT
Al treilea operator logic din cei trei operatori de baza este NOT, negarea. NOT nu este un operator care poate fi descris practic. Este un operator putin mai abstract dar foarte usor de inteles. NOT ne ofera inversul valorii. Cum matematica booleana se aplica doar in binar, daca folosim NOT asupra lui 0, rezultatul va fi 1. Daca se aplica NOT asupra lui 1, rezutlatul va fi 0. Logic chestia asta se exprima in felul urmator:
NOT 1 = 0
Simplu, nu ? Chiar mai simplu decat ceilalti doi operatori :-)
OK, am prins ideea cu operatorii logici. In practica, pentru o utilizare facila, s-au creat cativa operatori noi care sunt de fapt combinatii ale celor trei operatori. Sunt la fel de simpli ca ceilalti trei (AND, OR, NOT) doar ca trebuie sa ii stiti pe ceilalti trei ca sa ii intelegeti pe cei care urmeaza.
NAND
Operatorul NAND, dupa cum ii spune si numele (NOT AND), este un operator AND negat. Adica se aplica operatorul AND asupra valorilor iar rezultatul este negat. Logic ar arata de forma:
0 NAND 1 = NOT (0 AND 1) = 1
1 NAND 0 = NOT (1 AND 0) = 1
1 NAND 1 = NOT (1 AND 1) = 0
Dupa cum vedeti, e simplu. Am facut si translatarea operatorului in opreatori simpli (NOT si AND) ca sa fie mai usor de inteles. 0 NAND 0 este 1 pentru ca prima data se aplica operator AND asupra valorilor. Rezultatul va fi 0, cum e normal pentru o operatie AND, dar pentru ca e NAND, nu AND, rezultatul va fi negat. Deci, rezultatul final va fi inversul operatiei AND, va fi AND negat ( 1 ).
NOR
Operatorul OR nu mai are nevoie de prezentare. Cred ca v-ati prins deja ce face judecand dupa ce e mai sus. Ia o operatie OR, ii afla rezultatul iar apoi returneaza rezultatul negat. Logic se exprima de forma:
0 NOR 1 = NOT (O 0R 1) = 0
1 NOR 0 = NOT (1 OR 0) = 0
1 NOR 1 = NOT (1 OR 1) = 0
Dupa cum vedeti nu e mare filosofie nici cu astea. Este un operator OR negat, nimic mai mult.
XOR
XOR este cunoscut si cu numele de “sau exclusiv” sau in engleza “exclusive or”. Practic este un operator ceva mai complex decat cei prezentati mai sus pentru ca este o combinatie intre operatorii AND si NOR. Principala utilizare a operatorului XOR este verificarea diferentelor. Adica, XOR ne returneaza 1 atunci cand elementele implicate in operatie sunt diferite. Exprimarea logica ar fi urmatoarea:
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0
XNOR
Ultimul element din logica booleana este XNOR care este operatorul XOR negat. Adica, daca operatorul XOR ne spune cand elementele sunt diferite, operatorul XNOR ne spune cand elementele sunt identice. Exprimarea logica este urmatoarea:
0 XNOR 1 = 0
1 XNOR 0 = 0
1 XNOR 1 = 1
Dupa cum spuneam, operatorii au diferite aplicatii. De la nivelele cele mai de jos - matrici din CIP-uri - pana la nivelele cele mai de sus - programare in limbaje de programare de nivel inalt. In principiu toate limbajele de programare trebuie sa aiba implementate cel putino o parte operatiile astea sub o anumita forma. In limbajele de asamblare o sa gasiti operatorii in exact aceeasi forma: AND, OR, NOT etc. In limbajele de nivel inalt se mai folosesc si notatii precum & pentru AND, | pentru OR sau ! pentru negare. Important e sa intelegeti utilizarea operatorilor ca implementarea operatiilor intr-un anumit limbaj nu va fi grea deloc.
Sper ca vi s-a parut util tutorialul. Daca aveti intrebari, le astept pe forum ;-)
Categoria: Programare
