Битски оператори у програмском језику 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, те ће тај број бити исписан на конзоли.
Референце
[уреди | уреди извор]- ^ 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.
- ^ [1] Архивирано на сајту Wayback Machine (2016-04-21) Конјункција
- ^ „Дисјункција” (PDF). Архивирано из оригинала (PDF) 21. 04. 2016. г. Приступљено 09. 04. 2016.