Bitski operatori u programskom jeziku C

U okviru programskog jezika S možemo izvršavati operacije na nivou bita koristeći binarne operatore. Poznavanje binarnih operatora nam pomaže oko mnogobrojnih optimizacija u kodu te "elegantnijih rešenja".

Najbolji primer kroz koji možemo oslikati prednosti korišćenja binarnih operatora jeste višestruka if petlja gde unutar jednog if-a možemo postaviti beskonačno mnogo uslova. Najčešće korišćeni binarni operatori su logički operatori I i ILI, a uz njih ćemo prikazati i šiftovanje brojeva u levu i desnu stranu.

Operatori uredi

Pre same priče o operatorima napomenućemo da unutar programskog jezika S, vrednosti ispitivanja logičkih promenljivih mogu biti "TAČNO" (u kom slučaju funkcija koju ispitujemo vraća nulu - 0) ili "NETAČNO" (kada funkcija vraća jedinicu - 1). Primera radi, ako nešto ispitujemo unutar if naredbe, naš uslov može biti zadovoljen, u tom slučaju će program vratiti 1 te će se ispuniti telo same petlje. U suprotnom, funkcija vraća 0, te ne ulazi u telo petlje već odlazi u telo else dela.[1]

Binarno I - & uredi

A B A & B
0 0 0
1 0 0
0 1 0
1 1 1
Logička konjunkcija:

U tablici istinitosti iznad videli smo kako će se ponašati naša funkcija kada imamo dva uslova međusobno povezana logičkim I.

Пример:
   int i=5;
   int j=4;
   if(i>0 && j>0){
       printf("Сви услови су испуњени.");
   }
   else{
       printf("Бар један од услова није испуњен.");
   }

Jasno, uslovi koje smo naveli unutar IF petlje su ispunjeni te ćemo na konzoli dobiti prvu poruku. Samim korišćenjem binarnih operatora izbeli smo dvostruku IF naredbu, sebi smo skratili posao i obavili ga na dosta "elegantniji" način.

Napomena: kao što vidite u primeru iznad za vezivanje uslova koristili smo dvostruki ampersent (logičko I). Identičan rezultat bismo dobili i da smo koristili samo jedno "I". Razlika između dva načina je u tome što se kada koristimo dva "I" uslovi proveravaju do onog trenutka dok su ispunjeni, tj ukoliko bi primera radi prvi uslov bio netačan, ishod bi već bio poznat i sama petlja ne bi ni proveravala drugi uslov. Kada koristimo samo jedno "I", svi uslovi iz naše petlje biće ispitani bez obzira na to koliko ih ima i da li je nakon prvog ili nekog drugog od njih ishod poznat.[2]

Binarno ILI - | uredi

A B A ili B
0 0 0
1 0 1
0 1 1
1 1 1
Logička disjunkcija:

Priča je zapravo dosta slična kao i kada je u pitanju binarno I. Iz tablice istinitosti pak vidimo da će se telo IF petlje ispuniti ukoliko je bar jedan od uslova ispunjen. Jasno, kao i u prethodnom slučaju i ovde možemo koristiti jednu ili dve uspravne crte u samom kodu. Ukoliko koristimo jednu, svi uslovi iz petlje će biti ispitani, u suprotnom odmah nakon otkrivanja istinitosti prvog uslova izvršiće se naredbe.[3]

Primer:

   int i=5;
   int j=4;
   int z=-3;
   if(i<0 || j<0 || z<0){
       printf("Бар један од услова је испуњен.");
   }
   else{
       printf("Ниједан од услова није испуњен.");
   }

Binarno isključiva disjunkcija - ^ uredi

A B A ^ B
0 0 0
1 0 1
0 1 1
1 1 0

Kada je reč o isključivoj (ekskluzivnoj) disjunkciji naša petlja će biti izvršena ako je jedan od uslova ispunjen ali ne i dva. Dakle, telo naše IF petlje će biti ispunjeno ukoliko je ispunjen uslov A ili uslov B, u suprotnom se neće izvršiti.

Primer:

   int j=4;
   int z=-3;
   if(j<0 ^ z<0){
       printf("Услов испуњен.");
   }
   else{
       printf("Услов није испуњен.");
   }

Binarno NE - ~ uredi

A ~A
0 1
1 0

Binarno NE ili komplement broja označićemo sa tilda (~) i njegova uloga će biti da promeni predznak broja.

Primer:

   int j=4;
   int b=~j; // b=-4;

Šiftovanje uredi

Šiftovanje je još jedna korisna operacija koju možemo realizovati korišćenjem binarnih operatora. Promenljivu možemo šiftovati u levu ili desnu stranu, te će nam program u zavisnosti od toga vratiti broj koji dobijamo šiftovanjem zapisa broja u binarnom obliku.

Šiftovanje u desnu stranu - >> uredi

Ako šiftujemo broj u desnu stranu, zapravo ćemo ga smanjiti. Cifre u binarnom zapisu broja ćemo pomeriti za po jedno mestu udesno i na poslednje mesto dodati nulu.

Primer:

   int j= 14; // број 14 ће у бинарном запису изгледати овако: 1110;
   int b= j >> 1; // ако га шифтујемо у ДЕСНУ страну добијамо ово: 0111, цифре одлазе за по једно место удесно и додајемо 0;
   printf("%d",b); // број који смо добили у декадном систему има вредност 7, те ће се седмица исписати на конзоли.

Da ponovimo, pri šiftovanju cifre odlaze za po jedno mesto u desnu stranu, prvu cifru gladano sa desne strane gubimo, na njeno mesto dolazi prva sledeća i to se redom ponavlja do poslednje cifre. Na mesto poslednje cifre dolazi nula i naš postupak je završen. Isti slučaj je i kada broj šiftujemo ulevo.

Šiftovanje u levu stranu - << uredi

Ako napravimo paralelu sa šiftovanjem udesno, jedina suštinska razlika će biti što ovog puta šiftovanjem dobijamo veći broj u odnosu na početni. Cifre pomeramo za po jedno mesto u levu stranu a na mesto prve cifre zapisujemo nulu.

Primer:

   int j= 14; // ако се вратимо претходном примеру и броју 14 који у бинарном систему има запис: 1110; 
   int b= j << 1; // шифтујемо ли га у леву страну добићемо запис: 11100;
   printf("%d",b); // тако добијени број у декадном систему има вредност 28, те ће тај број бити исписан на конзоли.

Reference uredi

  1. ^ Kernighan; Ritchie, Dennis M. (1988). The C Programming Language (2nd izd.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-110362-7. Arhivirano iz originala 06. 11. 2008. g. Pristupljeno 26. 01. 2017.  Regarded by many to be the authoritative reference on C.
  2. ^ [1] Arhivirano na sajtu Wayback Machine (21. april 2016) „Arhivirana kopija”. Arhivirano iz originala 21. 04. 2016. g. Pristupljeno 09. 04. 2016.  Konjunkcija
  3. ^ „Disjunkcija” (PDF). Arhivirano iz originala (PDF) 21. 04. 2016. g. Pristupljeno 09. 04. 2016.