Битски оператори у програмском језику C

У оквиру програмског језика С можемо извршавати операције на нивоу бита користећи бинарне операторе. Познавање бинарних оператора нам помаже око многобројних оптимизација у коду те "елегантнијих решења".

Најбољи пример кроз који можемо осликати предности коришћења бинарних оператора јесте вишеструка if петља где унутар једног if-а можемо поставити бесконачно много услова. Најчешће коришћени бинарни оператори су логички оператори И и ИЛИ, а уз њих ћемо приказати и шифтовање бројева у леву и десну страну.

Оператори уреди

Пре саме приче о операторима напоменућемо да унутар програмског језика С, вредности испитивања логичких променљивих могу бити "ТАЧНО" (у ком случају функција коју испитујемо враћа нулу - 0) или "НЕТАЧНО" (када функција враћа јединицу - 1). Примера ради, ако нешто испитујемо унутар if наредбе, наш услов може бити задовољен, у том случају ће програм вратити 1 те ће се испунити тело саме петље. У супротном, функција враћа 0, те не улази у тело петље већ одлази у тело else дела.[1]

Бинарно И - & уреди

А Б А & Б
0 0 0
1 0 0
0 1 0
1 1 1
Логичка конјункција:

У таблици истинитости изнад видели смо како ће се понашати наша функција када имамо два услова међусобно повезана логичким И.

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

Јасно, услови које смо навели унутар ИФ петље су испуњени те ћемо на конзоли добити прву поруку. Самим коришћењем бинарних оператора избели смо двоструку ИФ наредбу, себи смо скратили посао и обавили га на доста "елегантнији" начин.

Напомена: као што видите у примеру изнад за везивање услова користили смо двоструки амперсент (логичко И). Идентичан резултат бисмо добили и да смо користили само једно "И". Разлика између два начина је у томе што се када користимо два "И" услови проверавају до оног тренутка док су испуњени, тј уколико би примера ради први услов био нетачан, исход би већ био познат и сама петља не би ни проверавала други услов. Када користимо само једно "И", сви услови из наше петље биће испитани без обзира на то колико их има и да ли је након првог или неког другог од њих исход познат.[2]

Бинарно ИЛИ - | уреди

А Б А или Б
0 0 0
1 0 1
0 1 1
1 1 1
Логичка дисјункција:

Прича је заправо доста слична као и када је у питању бинарно И. Из таблице истинитости пак видимо да ће се тело ИФ петље испунити уколико је бар један од услова испуњен. Јасно, као и у претходном случају и овде можемо користити једну или две усправне црте у самом коду. Уколико користимо једну, сви услови из петље ће бити испитани, у супротном одмах након откривања истинитости првог услова извршиће се наредбе.[3]

Пример:

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

Бинарно искључива дисјункција - ^ уреди

А Б А ^ Б
0 0 0
1 0 1
0 1 1
1 1 0

Када је реч о искључивој (ексклузивној) дисјункцији наша петља ће бити извршена ако је један од услова испуњен али не и два. Дакле, тело наше ИФ петље ће бити испуњено уколико је испуњен услов А или услов Б, у супротном се неће извршити.

Пример:

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

Бинарно НЕ - ~ уреди

А
0 1
1 0

Бинарно НЕ или комплемент броја означићемо са тилда (~) и његова улога ће бити да промени предзнак броја.

Пример:

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

Шифтовање уреди

Шифтовање је још једна корисна операција коју можемо реализовати коришћењем бинарних оператора. Променљиву можемо шифтовати у леву или десну страну, те ће нам програм у зависности од тога вратити број који добијамо шифтовањем записа броја у бинарном облику.

Шифтовање у десну страну - >> уреди

Ако шифтујемо број у десну страну, заправо ћемо га смањити. Цифре у бинарном запису броја ћемо померити за по једно месту удесно и на последње место додати нулу.

Пример:

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

Да поновимо, при шифтовању цифре одлазе за по једно место у десну страну, прву цифру гладано са десне стране губимо, на њено место долази прва следећа и то се редом понавља до последње цифре. На место последње цифре долази нула и наш поступак је завршен. Исти случај је и када број шифтујемо улево.

Шифтовање у леву страну - << уреди

Ако направимо паралелу са шифтовањем удесно, једина суштинска разлика ће бити што овог пута шифтовањем добијамо већи број у односу на почетни. Цифре померамо за по једно место у леву страну а на место прве цифре записујемо нулу.

Пример:

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

Референце уреди

  1. ^ Kernighan; Ritchie, Dennis M. (1988). The C Programming Language (2nd изд.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-110362-7. Архивирано из оригинала 06. 11. 2008. г. Приступљено 26. 01. 2017.  Regarded by many to be the authoritative reference on C.
  2. ^ [1] Архивирано на сајту Wayback Machine (21. април 2016) „Архивирана копија”. Архивирано из оригинала 21. 04. 2016. г. Приступљено 09. 04. 2016.  Конјункција
  3. ^ „Дисјункција” (PDF). Архивирано из оригинала (PDF) 21. 04. 2016. г. Приступљено 09. 04. 2016.