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

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

Оператори

Пре саме приче о операторима напоменућемо да унутар програмског језика С, вредности испитивања логичких променљивих могу бити "ТАЧНО" (у ком случају функција коју испитујемо враћа нулу - 0) или "НЕТАЧНО" (када функција враћа јединицу - 1). Примера ради, ако нешто испитујемо унутар -{if}- наредбе, наш услов може бити задовољен, у том случају ће програм вратити 1 те ће се испунити тело саме петље. У супротном, функција враћа 0, те не улази у тело петље већ одлази у тело -{else}- дела. Regarded by many to be the authoritative reference on C.

Бинарно И - &

А Б А & Б 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("Бар један од услова није испуњен.");

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

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

Бинарно ИЛИ - |

А Б А или Б 0 0 0 1 0 1 0 1 1 1 1 1

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

Пример: 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, те ће тај број бити исписан на конзоли.

Референце

Категорија:Програмски језик C Категорија:Бинарна аритметика