Оператори над битовима (Јаничић, Марић: Програмирање 2, тачка 5.6) Оператори за рад са појединачним битовима Само на целобројне аргументе: ~ битовска негација & битовска конјункција (и) битовска (инклузивна) дисјункција (или) ^ битовска ексклузивна дисјункција (или-или) << померање (шифтовање) битова улево >> померање (шифтовање) битова удесно &=, =, ^=, >>=, >>= битовске доделе 1/22
Оператори: приоритети 1. (), [ ] sleva nadesno 2.!,, ++,--, +,, *, &, (tip) zdesna nalevo 3. *, /, % sleva nadesno 4. +, sleva nadesno 5. <<, >> sleva nadesno 6. <, <=, >, >= sleva nadesno 7. ==,! = sleva nadesno 8. & sleva nadesno 9. ˆ sleva nadesno 10. sleva nadesno 11. && sleva nadesno 12. sleva nadesno 13.?: zdesna ulevo 14. =,+=,-=,/=,%=,&=,ˆ=, =,<<=,>>= zdesna ulevo 15., sleva udesno 2/22
Оператори: приоритети Дискусија Највиши приоритет: унарни ~; бинарни <<, >>, између аритметичких и релацијских Остали: између релацијских и логичких: &, ^, Доделе скоро најнижи приоритет Асоцијативност 3/22
Битовски оператори: таблице А & B A B A ^ B ~A 4/22
Оператори над битовима: битовско и & - битовско и врши се конјункција појединачних битова два аргумента i-ти бит резултата је конјункција i-тих битова аргумената Пример: хексадекадно: 0x000000CF & 0x0000003F = 0x0000000F декадно: 207 & 63 = 15 207 & 63 = 15 00000000000000000000000011001111 207 & 00000000000000000000000000111111 63 ================================= 00000000000000000000000000001111 15 5/22
Оператори над битовима: битовско или - битовско или врши се дисјункција појединачних битова два аргумента i-ти бит резултата је дисјункција i-тих битова аргумената Пример: хексадекадно: 0x000000CF 0x0000003F = 0x000000FF декадно: 207 63 = 255 00000000000000000000000011001111 207 00000000000000000000000000111111 63 ================================= 00000000000000000000000011111111 255 6/22
Оператори над битовима: битовска негација ~ - битовска негација, тзв. једноструки комплемент врши се комплементирање појединачних битова аргумента i-ти бит резултата је комплемент i-тог бита аргумента Пример: ~63 = -64 (означена целобројна константа) 00000000000000000000000000111111 63 ======================== 11111111111111111111111111000000-64 7/22
Оператори над битовима: битовска ексклузивна дисјункција (xor) ^ - битовско или-или врши се ексклузивна дисјункција појединачних битова два аргумента i-ти бит резултата је ексклузивна дисјункција i-тих битова аргумената Пример: хексадекадно: 0x000000CF ^ 0x0000003F = 0x000000F0 декадно: 207 ^63 = 240 00000000000000000000000011001111 207 ^ 00000000000000000000000000111111 63 ================================= 00000000000000000000000011110000 240 8/22
Оператори над битовима: померање улево << лево померање (шифтовање) Битови првог аргумента померају се улево за број позиција наведен као други аргумент Почетни (леви) битови првог аргумента се губе а на завршна места резултата уписују се нуле Пример: (хексадекадно : 0x0000003F << 3 = 0x000001F8) (декадно : 63 << 3 = 504) 00000000000000000000000000111111 63 ========================= << 3 00000000000000000000000111111000 504 Лево померање за једну позицију одговара множењу са два Лево померање за n позиција одговара множењу са 2 n 9/22
Оператори над битовима: померање удесно >> десно померање (шифтовање) Битови првог аргумента померају се удесно за број позиција наведен као други аргумент Крајњи (десни) битови првог аргумента се губе Почетни (леви) битови првог аргумента се попуњавају нулама (логичко померање) ИЛИ попуњавају битовима знака (аритметичко померање) Аритметичко померање за једно место одговара дељењу првог аргумента са 2 10/22
Оператори над битовима: померање удесно Тип првог аргумента Неозначен логичко померање Означен аритметичко померање Пример: (хексадекадно : 0x0000003F >> 3 = 0x00000007) (декадно : 63 >> 3 = 7) 00000000000000000000000000111111 63 ======================== >> 3 00000000000000000000000000000111 7 11/22
Логички оператори vs оператори над битовима Пример: Вредност израза 1 && 2 je 1 Вредност израза 1&2 је 0 1 & 2 = 0 00000000000000000000000000000001 1 & 00000000000000000000000000000010 2 ========================= 00000000000000000000000000000000 0 12/22
Примена битовских оператора Битовски оператори се често примењују да би модификовали битове неког броја уз помоћ тзв. маске Маска: специјално припремљена константа којом се, уз помоћ битовских оператора, модификују битови неког броја Маска се такође гради применом битовски оператора Маска се бира према особинама битовских оператора 13/22
Примена битовског и Особина битовске конјункције је да је за сваки бит b Вредност b & 0 је 0 Вредност b & 1 је b Последица: број n у битовској конјункцији са неком маском производи резултат који има бит 0 на свакој позицији на којој маска има бит 0, а бит једнак одговарајућем биту броја n на свим осталим позицијама 14/22
Примена битовског и - пример ЗАДАТАК: Написати наредбу која на i-то место броја n поставља бит 0, а остале битове оставља неизмењеним. РЕШЕЊЕ: n & маска1 маска1: сви битови 1 осим бита на позицији i који је 0 маска1: негацијом маске маска2 која има све битове 0 осим бита на позицији i који је 1 маска2: померањем броја 1 за i места улево n & (~(1 << i)) 15/22
Примена битовског или Особина битовске дисјункције је да је за сваки бит b Вредност b 1 је 1 Вредност b 0 је b Последица: број n у битовској дисјункцији са неком маском производи резултат који има бит 1 на свакој позицији на којој маска има бит 1, а бит једнак одговарајућем биту броја n на свим осталим позицијама 16/22
Примена битовског или - пример ЗАДАТАК: Написати наредбу која на i-то место броја n поставља бит 1, а остале битове оставља неизмењеним. РЕШЕЊЕ: n маска маска: сви битови 0 осим бита на позицији i који је 1 маска: померањем броја 1 за i места улево n (1 << i) 17/22
Примена битовског илиили (xor) Особина битовске ексклузивне дисјункције је да је за сваки бит b Вредност b ^ 0 је b Вредност b ^ 1 је ~b Последица: број n у битовској ексклузивној дисјункцији са неком маском производи резултат који, у односу на број n, има инвертовани бит на оним позицијама на којим маска има бит 1, а неизмењени бит на осталим позицијама 18/22
Примена битовског илиили - пример ЗАДАТАК: Написати наредбу која инвертује бит на i-том месту броја n. РЕШЕЊЕ: n ^ маска маска: сви битови 0 осим бита на позицији i који је 1 маска: померањем броја 1 за i места улево n ^ (1 << i) 19/22
Примена битовских оператора - резиме Поставити нуле на неке изабране позиције датог броја: битовска конјункција броја са маском која на тим изабраним позицијама има нуле а на осталим - јединице Поставити јединице на изабране позиције датог броја: битовска дисјункција броја са маском која има јединице на тим изабраним позицијама а на осталим позицијама нуле Инвертовати битове на неким изабраним позицијама датог броја: Битовска ексклузивна дисјункција броја са маском која има јединице на тим изабраним позицијама а на осталим позицијама нуле 20/22
Оператори над битовима: пример Програм који размењује задати пар битова у учитаном броју; битови се задају као аргументи командне линије #include <stdio.h> unsigned Trampa(unsigned n, int i, int j); main(int argc, char **argv) { unsigned x; /*broj sa standardnog ulaza ciji se bitovi razmenjuju*/ int i,j; /*pozicije bitova za trampu*/ /*ocitavanje argumenata komandne linije i broja sa standarnog ulaza*/ sscanf(argv[1], %d, &i); sscanf(argv[2], %d, &j); scanf( %u, &x); printf( \n Nakon trampe vrednost unetog broja je %u \n, Trampa(x,i,j)); } 21/22
Пример функција Trampa unsigned Trampa(unsigned n, int i, int j) { //ako se bit na poziciji i razlikuje od bita na poziciji j, treba ih invertovati if (((n>>i)&1)!= ((n>>j)&1)) nˆ= (1<<i) (1<<j); return n; } 22/22