nav_dugme codeBlog codeBlog
  • početna Početna stranica
  • Sačuvani članci Sačuvani članci
  • Članci
     (spisak)
  • Kontakt
Povratak na vrh stranice

Info & povezani članci Info o članku - dugme

Info

trejler_sat Datum objave: 08.01.2020.

trejler_olovka Poslednja izmena: 17.03.2023.

trejler_dokument Jezici: C

trejler_teg_narandzasti Težina: 8/10

C
C++
C#
Java
Python
JavaScript
PHP
operatori
bitovski operatori
ascii
unicode
optimizacija
teorija

Povezani članci

Zašto baš binarni brojevi?Binarno stablo pretrageASCII, Unicode i UTF - Predstavljanje znakova na računarimaOperacije sa tekstualnim datotekama u programskim jezicima C i PythonIzbor prvog programskog jezikaKlase složenosti algoritama (O notacija)Uvod u dinamičko programiranjeMetode za optimizaciju algoritamaStrukture podatakaIT termini
Svi članci
Progress is possible only if we train ourselves to think about programs without thinking of them as pieces of executable code.
Edsger W. Dijkstra

Operacije sa bitovima u programskom jeziku C

Facebook LinkedIn Twitter Viber WhatsApp E-mail
zoom_plus zoom_minus bookmark
početna > Članci > Teorija

Uvod

Uobičajeni logički operatori u programskom jeziku C: &&, ||, ^^ i !, operišu nad celobrojnim promenljivama i uzimaju u obzir vrednosti operanada u celosti, pri čemu se vrednost 0 tumači kao "NETAČNO", a bilo koja vrednost različita od 0 (ne samo 1), tumači se kao "TAČNO", i pri tom nije moguće pristupati pojedinačnim bitovima.

U izradi rešenja za većinu 'rutinskih' zadataka, nije neophodno pristupati pojedinačnim bitovima, međutim, postoje i mnoge situacije u kojima takva mogućnost sasvim dobro dođe.

Prethodna konstatacija odnosi se pre svega na sistemsko programiranje - aktivnost koja između ostalog podrazumeva pristup hardveru, odnosno pristup pojedinačnim pinovima hardverskih komponenti (uključivanje, isključivanje, ili naprosto očitavanje vrednosti pojedinačnih pinova na određenom hardverskom portu i sl), što su operacije koje se mogu obaviti samo preko operatora koji imaju mogućnost operisanja nad pojedinačnim bitovima.

Može se takođe reći da su operacije nad pojedinačnim bitovima veoma zanimljive same po sebi (u očima većine programera), a vredi spomenuti i to da bitovski operatori pružaju zanimljive mogućnosti i u svakodnevnom programiranju.

Veoma zanimljive mogućnosti (od kojih ćemo neke prikazati već u ovom članku, a druge ćemo prikazati u budućim * člancima).

* Prvi 'konkretniji' primer koji nam u ovom trenutku pada na pamet, odnosi se na tumačenje Unicode znakova preko formata UTF-8 i UTF-16 (što je tematika kojom ćemo se u dogledno vreme baviti u zasebnom članku).

Takođe, napomenimo da bitovski operatori (o kojima diskutujemo), ne postoje samo u C-u i drugim "C-olikim" jezicima kao što su npr. C++, C#, Java, JavaScript, PHP i sl, već postoje i u Python-u i raznim drugim jezicima.

Pregled bitovskih operatora u C-u

U programskom jeziku C, pristup pojedinačnim bitovima (pri obavljanju logičkih operacija), postiže se upotrebom specijalizovanih operatora:

  • & - bitovska konjunkcija (bitovsko I)
  • | - bitovska disjunkcija (bitovsko ILI)
  • ^ - bitovska ekskluzivna disjunkcija (bitovski XOR)
  • ~ - invertovanje bitova (bitovsko NE)
  • << - pomeranje bitova ulevo
  • >> - pomeranje bitova udesno

Međutim, potrebno je odmah naglasiti da navedeni bitovski operatori nisu u stanju da obave operaciju na samo jednom paru bitova u dve celobrojne promenljive (bar ne direktno), već operišu nad svim parovima susednih bitova u dve promenljive koje učestvuju u operaciji.

.... odnosno, kada je u pitanju bitovski operator invertovanja (bitovska negacija), operator invertuje: sve bitove, u jednoj celobrojnoj promenljivoj.

Shodno navedenim uslovima, za konjunkciju, disjunkciju i XOR važi pravilo da se vrednost bita na poziciji p u rezultatu dobija obavljanjem operacije nad bitovima na poziciji p u operandima a i b (to jest, u slučaju operacije invertovanja, kao rezultat invertovanja bita na poziciji p u promenljivoj a).

Situacija u kojoj se ne može direktno pristupati pojedinačnim bitovima, može delovati pomalo problematično (i svakako zaslužuje pažnju), ali, uz pažljivo promišljanje, željeni rezultat se uvek može postići.

Za početak, razmotrićemo kako funkcionišu sami operatori.

Napomena: zarad ažurnosti (pri upoznavanju sa bitovskim operatorima, u nastavku), prikazaćemo: i opšte istinitosne tablice (kakve se koriste u matematici i odnose se na logičke operacije), i tablice koje se specifično odnose na bitovske operatore u C-u (i većem broju drugih programskih jezika).

Napomenimo i to da tablice, koje su vezane za bitovske operatore, zapravo važe i ako zamislimo da su "a" i "b" celobrojne promenljive koje se koriste kao operandi, ali, nije nam namera da prizivamo takve 'asocijacije', već, da na što praktičniji način prikažemo povezanost istinitosnih tablica opšteg tipa i tablica koje se primenjuju na parove bitova.

Operator & (bitovska konjunkcija)

Operacija logičke konjunkcije (koja je poznata i kao "logičko i", zbog idejne povezanosti sa veznikom "i" iz govornih jezika), obavlja se u skladu sa sledećom istinitosnom tablicom:

pqp ∧ q
⊥⊥⊥
⊥⊤⊥
⊤⊥⊥
⊤⊤⊤
Slika 1. - Istinitosna tablica za operaciju logičke konjunkcije.

Tablica istinitosti za bitovski operator konjunkcije, prikazana je na sledećoj slici:

aba & b
000
010
100
111
Slika 2. - Istinitosna tablica za bitovski operator konjunkcije.

Ukratko:

  • rezultat logičke konjunkcije je istinitosna vrednost 'TAČNO' - samo ukoliko su oba iskaza istinita
  • u slučaju bitovske konjunkcije, rezultat je 1 samo ukoliko oba bita imaju vrednost 1

Bitovski operator konjunkcije & (bitovsko I), operiše nad dve celobrojne vrednosti, pristupajući nezavisno parovima bitova na istoj poziciji u obe promenljive, pri čemu se na svaku pojedinačnu poziciju primenjuje tablica sa slike #2.

Kada se bitovski operator & upotrebi između dve osmobitne celobrojne promenljive, * dobija se sledeći rezultat:

10011101
&10101011
= 10001001
Slika 3. - Operator bitovske konjunkcije pristupa svakom paru bitova nezavisno (što će biti slučaj i sa još nekoliko operatora u nastavku). Rezultat bitovske konjunkcije je 1 - samo na onim pozicijama na kojima oba bita imaju vrednost 1.

* Iako su celobrojne promenljive tipično 32-bitne (duži niz godina unazad), u primerima ćemo prikazivati 8-bitne neoznačene promenljive (zarad preglednosti).

Operator | (bitovska disjunkcija)

Logička disjunkcija (poznata i kao "logičko ILI", zbog idejne povezanosti sa veznikom ili), obavlja se u skladu sa sledećom istinitosnom tablicom:

pqp ∨ q
⊥⊥⊥
⊥⊤⊤
⊤⊥⊤
⊤⊤⊤
Slika 4. - Istinitosna tablica za operaciju logičke disjunkcije.

Tablica istinitosti za bitovski operator disjunkcije, prikazana je na sledećoj slici:

aba | b
000
011
101
111
Slika 5. - Istinitosna tablica za bitovski operator disjunkcije.

Ukratko:

  • rezultat logičke disjunkcije je 'TAČNO', ukoliko je tačan bilo koji od dva iskaza
  • u slučaju bitovske disjunkcije, rezultat je 1 ukoliko bilo koji od dva bita ima vrednost 1

Bitovski operator disjunkcije | (bitovsko ILI), takođe je binarni operator, a primer upotrebe bitovskog operatora disjunkcije možemo videti na sledećoj slici:

10011101
|10101011
=10111111
Slika 6. - Bitovska disjunkcija, primenjena na svaki par bitova nezavisno, daje rezultat 1 na svim pozicijama na kojima makar jedan od dva bita ima vrednost 1.

Operator ^ (bitovska isključiva disjunkcija)

Logička operacija ekskluzivne disjunkcije (isključivo ILI, odnosno XOR (ovoga puta nećemo tražiti očigledne 'paralele' sa govornim jezikom :))), obavlja se u skladu sa sledećom istinitosnom tablicom:

pqp ⊻ q
⊥⊥⊥
⊥⊤⊤
⊤⊥⊤
⊤⊤⊥
Slika 7. - Istinitosna tablica za operaciju logičke disjunkcije.

Tablica istinitosti za bitovski operator XOR, prikazana je na sledećoj slici:

aba ^ b
000
011
101
110
Slika 8. - Istinitosna tablica za bitovski operator XOR.

Ukratko:

  • rezultat isključive disjunkcije je 'TAČNO' - samo ukoliko je istinit tačno jedan od dva uslova (to jest, u situacijama kada dva iskaza sadrže različite istinitosne vrednosti)
  • u slučaju bitovske ekskluzivne disjunkcije, rezultat je 1 ukoliko par bitova sadrži jednu nulu i jednu jedinicu (to jest, ukoliko su bitovi različiti)

Kada se tablica sa slike #8 primeni na dve celobrojne vrednosti, preko bitovskog operatora ekskluzivne disjunkcije ^ (bitovskog XOR-a), dobija se sledeći rezultat:

10011101
^10101011
=00110110
Slika 9. - U skladu sa tablicom isključive disjunkcije, operator ^ daje vrednost 1 samo na onim pozicijama na kojima par bitova sadrži jednu nulu i jednu jedinicu.

Operator ~ (bitovska negacija / invertovanje bitova)

Operacija logičke negacije (invertovanje/logičko NE), obavlja se u skladu sa sledećom istinitosnom tablicom:

p¬p
⊥⊤
⊤⊥
Slika 10. - Istinitosna tablica za operaciju logičke negacije.

Tablica istinitosti za bitovski operator logičke negacije, prikazana je na sledećoj slici:

a~a
01
10
Slika 11. - Istinitosna tablica za bitovski operator logičke negacije.

Ukratko:

  • u opštem smislu, ukoliko je istinitosna vrednost iskaza "NETAČNO", rezultat logičke negacije je "TAČNO"; ukoliko je istinitosna vrednost iskaza "TAČNO", rezultat logičke negacije je "NETAČNO"
  • u slučaju bitovske negacije, ukoliko je bit prethodno imao vrednost 0, dobija vrednost 1; ukoliko je bit prethodno imao vrednost 1, dobija vrednost 0

Za razliku od drugih operatora koji su do sada opisani (i nekoliko operatora koji tek slede), bitovski operator negacije ~ je unarni operator, što znači da operiše nad jednom promenljivom.

Primer upotrebe bitovskog operatora ~ možemo videti na donjoj slici:

~10011101
=01100010
Slika 12. - U skladu sa tablicom za operaciju negacije (slika #11), operator ~ "obrće bitove" (0 postaje 1; 1 postaje 0).

Operator << (pomeranje bitova ulevo)

Operator << je binarni bitovski operator preko koga se svi bitovi celobrojne promenljive pomeraju određeni broj mesta ulevo.

U naredbi a << n, svi bitovi promenljive a pomeraju se za n mesta ulevo, pri čemu važe sledeća pravila:

  • uključeni bitovi sa leve strane, za koje posle pomeranja ulevo nema mesta - jednostavno se zanemaruju
  • sa desne strane dopisuju se nule

Na primer, ukoliko promenljiva a na početku ima vrednost 1, posle operacije a << 2 imaće vrednost 4.

.... ali će zato neoznačena osmobitna promenljiva sa vrednošću 128, posle operacije a << 1, imati vrednost 0!

(Ako ima čitalaca koji su nepopravljivo skloni pošalicama i 'primećivanju svih detalja', napomenimo za svaki slučaj da nije u pitanju jednakost 0! = 1. 🙂)

Praktičan primer upotrebe operatora << možemo videti na donjoj slici:

10011101
<<00000010
= 01110100
Slika 13. - Pomeranje bitova ulevo za dva mesta (bitovi koji ne mogu biti smešteni sa leve strane - nestaju, a desno se dopisuju nule).

Pri upotrebi operatora pomeranja bitova ulevo, mora se uvek voditi računa o 'levim bitovima' promenljive, jer (baš kao u slučaju sa gornje slike), lako se može desiti da neki od bitova praktično budu izbrisani!

Pomenuli smo na početku da bitovski operatori dobro dođu i u svakodnevnim situacijama, i stoga, u praktičnom smislu (ukoliko sa leve strane ima dovoljno mesta za jedinice koje se pomeraju), upotrebom operatora <<, određena vrednost se lako može pomnožiti nekim od stepena broja dva (tj. vrednostima kao što su 2, 4, 8, 16 .... 128, 256, 512 i sl).

Operator >> (pomeranje bitova udesno)

Operator >> je binarni bitovski operator preko koga se svi bitovi celobrojne promenljive pomeraju određeni broj mesta udesno.

U naredbi a >> n, svi bitovi promenljive a pomeraju se za n mesta udesno, pri čemu važe sledeća pravila:

  • uključeni bitovi sa desne strane, za koje posle pomeranja udesno nema mesta - jednostavno se zanemaruju
  • sa leve strane dopisuju se nule

Na primer, ukoliko promenljiva a na početku ima vrednost 8, posle operacije a >> 2 imaće vrednost 2.

Praktičan primer upotrebe operatora >> možemo videti na donjoj slici:

10011101
>>00000010
= 00100111
Slika 14. - Pomeranje bitova udesno za dva mesta (uključeni bitovi sa desne strane, za koje posle pomeranja nema mesta - zanemaruju se, a levo se dopisuju nule).

Pri upotrebi operatora pomeranja bitova udesno, takođe se mora uvek voditi računa o jedinicama sa (ovoga puta) desne strane.

Međutim, ukoliko se operator >> koristi kao mehanizam za "brzinsko deljenje nekim od stepena dvojke", jasno je da je u pitanju celobrojno deljenje bez ostatka, ali, takođe je jasno (shodno svemu što smo prethodno naveli), da se uvek dobija korektan rezultat.

Složene operacije sa bitovima

Pošto smo se upoznali sa osnovnim operatorima, upoznaćemo se i sa tipičnim složeni(ji)m operacijama koje se obavljaju nad pojedinačnim bitovima celobrojnih promenljivih.

Pre svega, vraćamo se na jedno od glavnih pitanja sa početka: kako se može izvesti da određeni operator utiče samo na određeni bit u promenljivoj (tj. kako da ne utiče na celu promenljivu)?

Maskiranje bita

Operacija koja se popularno naziva "maskiranje bit(ov)a", podrazumeva (tipično, ali ne uvek; videćemo u nastavku), upotrebu pomoćne promenljive koja ima isključene sve bitove, i jedan uključen bit - na poziciji na kojoj je u glavnoj promenljivoj potrebno očitati vrednost bita ili obaviti neku drugu operaciju.

Uključivanje određenog bita (u pomoćnoj promenljivoj), najlakše se izvodi tako što se na početku uključi samo najniži bit (praktično, preko naredbe dodele m = 1), posle čega se najniži bit postavlja na poziciju p preko operatora pomeranja ulevo: m = m << (p - 1);.

m (maska) 00000001
p 4
m << (p - 1)00001000
Slika 15. - Uključivanjem najnižeg bita i pomeranjem bitova za tri mesta ulevo, praktično je uključen četvrti bit (odnosno - kreirana je "maska" za 4. bit sa desne strane).

Na ovom mestu iznećemo i jednu napomenu tehničke prirode.

U idejnom smislu, postupak koji smo videli na slici je korektan, ali, u praktičnom smislu (u programskim jezicima), naredba kao što je ....

		
m << (p - 1);
		
	
Slika 16. - Naredba preko koje se (naizgled) pomeraju bitovi u promenljivoj m (dok se rezultat, zapravo, samo privremeno čuva u memoriji).

.... neće zapravo dovesti do pomeranja bitova u promenljivoj m - jer se rezultat ne čuva!

Verujemo da je čitaocima poznato od ranije da naredba kao što je m + 1 takođe ne dovodi do uvećanja vrednosti promenljive m (a napomenimo i to da je naredba dodele na slici #15 izostavljena isključivo zarad preglednosti).

Da bi rezultat bio sačuvan, neophodno je koristiti naredbu dodele:

		
m = m << (p - 1);
		
	
Slika 17. - Naredba preko koje se (ovoga puta 'za prave'), pomeraju bitovi u promenljivoj m.

Pogledajmo kako tehnike maskiranja pomažu pri izvođenju 'konkretnijih' operacija sa pojedinačnim bitovima.

Uključivanje pojedinačnog bita

Za uključivanje određenog bita (odnosno, za zadavanje vrednosti 1 određenom bitu), potrebno je prvo "maskirati" poziciju ....

m 00000001
p 4
m << (p - 1)00001000
Slika 18. - Generisanje "maske" pomeranjem uključenog bita na poziciju p.

.... i potom pozvati bitovski operator disjunkcije (bitovsko ILI):

a 11010101
m (maska)00001000
a = a | m 11011101
Slika 19. - Uz masku sa prethodne slike, bitovski operator disjunkcije ostaviće sve bitove - osim "maskiranog" bita - u prvobitnom stanju, a maskirani bit će (obavezno) biti uključen.

Svi bitovi, osim "maskiranog" bita, zadržaće svoje vrednosti, a maskirani bit će posle izvršavanja operacije obavezno imati vrednost 1.

I ovoga puta (zarad preglednosti), na prvoj slici smo izostavili naredbu dodele, koju bismo u kodu (naravno) koristili, a isto važi i za primere u narednim odeljcima.

Isključivanje pojedinačnog bita

Za isključivanje određenog bita, prvo je potrebno napraviti standardnu masku (kakvu smo koristili i u prethodnom primeru):

m 00000001
p 4
m << (p - 1)00001000
Slika 20. - Generisanje "maske" pomeranjem uključenog bita na poziciju p (u međukoraku, maska će biti invertovana).

U sledećem koraku, maska se invertuje * (preko operatora ~).

* Drugim rečima, svi bitovi menjaju vrednost (nule postaju jedinice, a jedinice postaju nule).

Na kraju, poziva se bitovski operator konjunkcije (bitovsko I):

a 11011101
~m11110111
a = a & ~m 11010101
Slika 21. - Upotrebom invertovane maske (i operatora bitovske konjunkcije), postiže se da svi uključeni bitovi ostanu uključeni, dok će prvobitno uključeni bit na poziciji p, na kraju biti isključen.

Preko invertovane maske, postigli smo da se isključi samo bit na poziciji p (koji je potrebno isključiti, i koji biva isključen).

U praktičnom smislu, maska nema uticaj na ostale bitove.

Očitavanje vrednosti pojedinačnog bita

Moglo bi se reći da je očitavanje vrednosti bita (na određenoj poziciji), najopštija od svih operacija koje se 'ikako' mogu izvoditi nad pojedinačnim bitovima, međutim, za razliku od prethodno opisanih operacija za koje praktično postoji jedan uobičajeni/optimalni postupak (koji se gotovo uvek koristi), za očitavanje bita postoje dva različita uobičajena pristupa, i upravo zato smo kraću diskusiju o operaciji očitavanja vrednosti bita ostavili "za pred kraj".

Varijanta 1

Sa jedne strane, sasvim je moguće (u praktičnom smislu), * očitati vrednost bita na određenoj poziciji uz upotrebu standardne maske kakvu smo već koristili:

a 11101001
m (maska) 00001000
a = a & m 00001000
Slika 22. - Očitavanje vrednosti bita na poziciji p - preko uobičajene maske.

Ideja se može implementirati na sledeći način:

		
a = 233; // proizvoljna vrednost;
         // zanima nas (samo) 4. bit sa desne strane
p = 4;
m = 1 << (p - 1); // praktično: m = 8
r = a & m; // u ovom slučaju, krajnji rezultat je takođe 8;
           // u opštem smislu, rezultat je: ili 0, ili stepen
           // broja 2 koji odgovara poziciji koja se očitava
		
	
Slika 23. - Implementacija algoritma sa prethodne slike.

.... pri čemu se kao rezultat dobija: ili 0, ili (praktično), "kopija" promenljive m (koja predstavlja masku).

* Rezultat nije "0 ili 1", ali, u "praktičnom" smislu, ustanovili smo da li je bit uključen ili nije.

Varijanta 2

U većini svakodnevnih situacija (budući da prethodni algoritam nije 'baš' pogodan za ekonomično zapisivanje u jednoj liniji koda), tipično se sprovodi postupak preko koga se traženi bit prvo pomera na najnižu poziciju, i potom se očitava vrednost krajnjeg desnog bita (ili, zapravo - vrednost traženog bita).

Ako je potrebno očitati npr. 4. bit sa desne strane u promenljivoj a, traženi bit se prvo dovodi na krajnju desnu poziciju, preko operatora >>:

a 11101001
p 4
a >> (p - 1)00011101
Slika 24. - U drugoj varijanti očitavanja bita na 4. poziciji, prvo je potrebno navedeni bit postaviti na 1. poziciju (pomeranjem svih bitova udesno za 3 mesta).

U drugom koraku - uz korišćenje bitovskog operatora konjunkcije - rezultat se svodi na 0 ili 1 (i pamti se preko dodatne promenljive).

x 00011101
1 00000001
r = x & 1 00000001
Slika 25. - Upotrebom bitovske konjunkcije, rezultat se svodi na 0 ili 1.

Napomena: ukoliko se primeni pravilan postupak, vrednost promenljive a se neće promeniti (više o svemu u nastavku).

Programski kod je još jednostavniji (nego što bi se dalo naslutiti posmatranjem primera sa prethodne dve slike):

		
// a = 233;
// p = 4;
r = a >> (p - 1) & 1;
		
	
Slika 26. - Praktičan primer programskog koda za očitavanje bita na poziciji p (u promenljivoj a).

Cela naredba se zapisuje u jednom redu, nema pomoćnih promenljivih, * a sama promenljiva a zadržava (prethodnu) vrednost.

Da pojasnimo dodatno: vrednost promenljive a se kopira na (neimenovanu) pomoćnu memorijsku lokaciju, obavlja se pomeranje bitova, računa se krajnji rezultat (koji se smešta u promenljivu r), i - budući da nema naredbe dodele koja bi promenila vrednost promenljive a - promenljiva a zadržava vrednost -- i pri tom je vrednost bita na poziciji p očitana (to jest 'glavni zadatak je rešen').

* U primerima, na gornjim slikama, zarad preglednosti smo koristili i pomoćnu promenljivu x, ali, u praksi tipično nema potrebe za uvođenjem pomoćnih promenljivih.

Invertovanje ("obrtanje") bita na poziciji p

Sa jedne strane, invertovanje pojedinačnog bita je zapravo krajnje jednostavna operacija (možda i najjednostavnija od svih), međutim, sa druge strane (bez obzira na prethodno navedenu jednostavnost), upotreba operatora XOR - koji naizgled nije namenjen "obrtanju" pojedinačnih bitova, na prvi pogled deluje manje intuitivno od upotrebe operatora ~ koji doslovno jeste namenjen invertovanju bitova (ali u ovom slučaju neće biti od pomoći), i stoga smo operaciju invertovanja pojedinačnih bitova ostavili za kraj.

Bilo kako bilo, dovoljno je samo maskirati određeni bit ....

m 00000001
p 4
m << (p - 1)00001000
Slika 27. - Generisanje "maske" pomeranjem uključenog bita na poziciju p.

.... i pozvati bitovski operator XOR:

a 11010101
m (maska) 00001000
a = a ^ m 11011101
Slika 28. - Invertovanje bita na poziciji #4: svi bitovi (izuzev označenog bita), zadržavaju prethodnu vrednost (budući da se "xor-uju" sa nulama), dok na četvrtoj (označenoj) poziciji dolazi do promene vrednosti bita.

.... koji (sada je jasno), deluje "kao poručeno" za ovakav zahvat:

  • ukoliko je bit prethodno bio isključen - biće uključen (0 ^ 1 = 1)
  • ukoliko je bit bio uključen - biće isključen (1 ^ 1 = 0)

Operator XOR (bilo da je u pitanju bitovska ili "nebitovska" varijanta), ima i brojne druge primene (o čemu ćemo pisati u budućim člancima), a za sam kraj vam ostavljamo da uživate u jednostavnosti i eleganciji algoritma za invertovanje pojedinačnih bitova.

Autor članka Nikola Vukićević Za web portal codeblog.rs
Napomena: Tekstovi, slike, web aplikacije i svi ostali sadržaji na sajtu codeblog.rs (osim u slučajevima gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog pismenog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook LinkedIn Twitter Viber WhatsApp E-mail
početna > Članci > Operacije sa bitovima u programskom jeziku C
codeBlog codeBlog
Sajt posvećen popularizaciji kulture i veštine programiranja.
Napomena: Tekstovi i slike na sajtu codeblog.rs (osim u slučajevima, gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook - logo
Instagram - logo
LinkedIn - logo
Twitter - logo
E-mail
Naslovna
   •
Uslovi korišćenja
   •
Obaveštenja
   •
FAQ
   •
Kontakt