Binarni, oktalni i heksadecimalni brojevi
Kako računalo broji nulama i jedinicama: binarni brojevi na LED-icama, bit, nibl i bajt, oktalni i heksadecimalni brojevi te njihov zapis u Arduino kodu.

Samo dva stanja
LED-ica može biti upaljena ili ugašena. Tipkalo je pritisnuto ili nije. Pin Arduina je HIGH ili LOW. Svaki put postoje samo dva stanja, a mi ih možemo zapisati kao 1 i 0.
Računalo, micro:bit i Arduino sve pamte i sve računaju samo pomoću nula i jedinica: brojeve, slova, slike i zvukove. Brojevi zapisani samo nulama i jedinicama zovu se binarni brojevi.
Kako se broji nulama i jedinicama?
Mi brojimo s deset znamenki, od 0 do 9. Kad nam ponestane znamenki, počnemo novo mjesto: nakon 9 dolazi 10. Svako mjesto vrijedi deset puta više od onoga desno od njega: jedinice, desetice, stotice…
U binarnom zapisu postoje samo dvije znamenke, 0 i 1, pa novo mjesto počinje već nakon 1. Svako mjesto vrijedi dva puta više od onoga desno od njega:

Broj dobiješ tako da zbrojiš vrijednosti mjesta na kojima je 1. Binarni broj 1101 je 8 + 4 + 1 = 13.
| Broj | Binarno | Kako se zbroji |
|---|---|---|
| 0 | 0 | |
| 1 | 1 | 1 |
| 2 | 10 | 2 |
| 3 | 11 | 2 + 1 |
| 4 | 100 | 4 |
| 5 | 101 | 4 + 1 |
| 6 | 110 | 4 + 2 |
| 7 | 111 | 4 + 2 + 1 |
| 8 | 1000 | 8 |
Gdje se koriste binarni brojevi?
- U svakom računalu i mobitelu. Slike, pjesme, igre i poruke spremljene su kao nizovi bitova. Svaka točkica na zaslonu (piksel) ima svoju boju, a boja je zapisana s nekoliko bajtova.
- U žicama i radiovezama. Kroz USB kabel, Wi-Fi i radio micro:bita putuju nule i jedinice, jedna za drugom. Kako se to radi, objašnjava stranica Kako uređaji razgovaraju.
- QR kod. Svaki tamni kvadratić je 1, a svaki svijetli 0. QR kod je slika od bitova, koju mobitel pročita kamerom.
- Brailleovo pismo. Znak pisma za slijepe ima šest mjesta za točkice, a svaka je izbočena ili nije. To je šest bitova, pa je moguće 64 različita znaka.
- Na Arduinu. Kad program pozove
pinMode()ilidigitalWrite(), u čipu se promijeni jedan bit. Svaki pin ima svoj bit, koji kaže je li pin ulaz ili izlaz, i svoj bit, koji kaže je liHIGHiliLOW.
Probaj: brojevi na karticama
Napravi pet kartica. Na prvu nacrtaj 16 točkica, na drugu 8, pa 4, 2 i 1. Složi ih u red, s 16 na lijevoj strani.

- Kartica okrenuta točkicama prema gore je 1, a okrenuta naopako 0.
- Broj je zbroj točkica na karticama koje vidiš.
- Pokušaj složiti 13: okreneš kartice 8, 4 i 1, pa je zapis 01101.
- Složi broj svojih godina. Koji je najveći broj koji možeš složiti s pet kartica?
Isto možeš napraviti s pet LED-ica u jednom retku zaslona micro:bita: upaljena LED-ica je 1, a ugašena 0. Cijeli zaslon micro:bita ima 25 LED-ica, pa može prikazati 25 nula i jedinica odjednom.

Najveći broj s pet kartica je 16 + 8 + 4 + 2 + 1 = 31. Sa šest kartica (dodaš 32) možeš složiti brojeve do 63. Svaka nova kartica udvostruči koliko brojeva možeš složiti.
Bitovi, nibli i bajtovi
Jedna binarna znamenka, jedna kartica ili jedna LED-ica, zove se bit. Osam bitova zajedno zove se bajt (engleski byte). Jedan bajt može zapisati brojeve od 0 do 255, jer je 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255.
Četiri bita, pola bajta, zovu se nibl (engleski nibble). Jedan nibl može zapisati brojeve od 0 do 15, jer je 8 + 4 + 2 + 1 = 15. Bajt ima dva nibla: lijeva četiri bita i desna četiri bita.
Zalogaj i grickanje
Engleska riječ byte izgovara se isto kao bite, što znači zalogaj. Kad je trebalo ime za pola bajta, netko se dosjetio riječi nibble, koja znači grickanje ili mali zalogaj. Ime se svidjelo i ostalo.
Memorija se mjeri u bajtovima. Arduino Uno ima 2 kB (2048 bajtova) memorije za varijable. Mobitel ima milijune puta više.
Oktalni i heksadecimalni brojevi
Od ovog mjesta stranica je za Arduino radionicu.
Brojevni sustavi
Način zapisivanja brojeva zove se brojevni sustav. Broj znamenki koje sustav koristi zove se baza, i ona kaže koliko vrijedi svako mjesto: svako mjesto vrijedi baza puta više od onoga desno od njega.
| Sustav | Baza | Znamenke | Vrijednosti mjesta | 200 u tom sustavu |
|---|---|---|---|---|
| dekadski | 10 | 0 do 9 | … 1000, 100, 10, 1 | 200 |
| binarni | 2 | 0 i 1 | … 128, 64, 32, 16, 8, 4, 2, 1 | 11001000 |
| oktalni | 8 | 0 do 7 | … 512, 64, 8, 1 | 310 |
| heksadecimalni | 16 | 0 do 9 i A do F | … 4096, 256, 16, 1 | C8 |
Isti broj, 200, izgleda u svakom sustavu drukčije, ali je uvijek isti broj. Provjera za oktalni: 3 · 64 + 1 · 8 + 0 · 1 = 200. Za heksadecimalni: C je 12, pa je 12 · 16 + 8 = 200.
Prvih sedamnaest brojeva u sva četiri sustava:
| Dekadski | Binarni | Oktalni | Heksadecimalni |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 10 | 2 | 2 |
| 3 | 11 | 3 | 3 |
| 4 | 100 | 4 | 4 |
| 5 | 101 | 5 | 5 |
| 6 | 110 | 6 | 6 |
| 7 | 111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
Zašto programeri uopće koriste oktalne i heksadecimalne brojeve? Zato što se iz binarnih u njih pretvara bez računanja: bitove samo podijeliš u skupine.
Heksadecimalni brojevi
Heksadecimalni sustav ima 16 znamenki: 0 do 9 i A do F (A je 10, B je 11 i tako do F, koji je 15). Jedna heksadecimalna znamenka je točno četiri bita, jedan nibl. Zato je bajt uvijek dvije heksadecimalne znamenke, svaki nibl po jedna.
Pretvaranje je jednostavno: binarni broj podijeli na nible, od desne strane, i svaki nibl zamijeni jednom znamenkom iz tablice gore. Broj 200 je binarno 1100 1000: nibl 1100 je C, a nibl 1000 je 8, pa je to C8.

Dug niz nula i jedinica lako se krivo pročita, a dvije heksadecimalne znamenke ne. Zato je heksadecimalni sustav najčešći način na koji programeri zapisuju bajtove.
Gdje se koriste heksadecimalni brojevi?
- Boje na webu. Narančasta ovog weba je
#ff8000. Svaka boja je jedan bajt: crvenaff(255), zelena80(128) i plava00(0). - Adrese uređaja na vezi I2C. Čip koji upravlja motorima Maqueena ima adresu
0x10(pogledaj stranicu Kako uređaji razgovaraju). - Mrežne adrese. Svaki uređaj u mreži, od mobitela do Wi-Fi modula, ima svoju adresu MAC od šest bajtova, koja se piše kao dvanaest heksadecimalnih znamenki, na primjer
3C:71:BF:4A:12:9E. - Slova u Unicodeu. Svako slovo svih jezika na svijetu ima svoj broj, koji se piše heksadecimalno: Č je
U+010C, a ŽU+017D. - Sadržaj datoteka. Programi koji pokazuju bajtove datoteke prikazuju ih heksadecimalno. Svaka slika PNG na ovom webu počinje bajtovima
89 50 4E 47, a zadnja tri od njih su slova P, N i G. - Adrese u memoriji. Kad program na računalu pukne, poruka o grešci često pokazuje heksadecimalnu adresu mjesta u memoriji na kojem se to dogodilo.
Oktalni brojevi
Oktalni sustav ima osam znamenki, od 0 do 7. Jedna oktalna znamenka je točno tri bita, pa se binarni broj u oktalni pretvara skupinama po tri bita, od desne strane. Broj 200 je binarno 11 001 000, a to je 3, 1 i 0: oktalno 310 (slika gore).
Bajt od osam bitova ne dijeli se lijepo na skupine po tri, pa se oktalni brojevi danas koriste rijetko. U jeziku C++ skrivaju se u jednoj zamci, opisanoj u sljedećem odjeljku.
Gdje se koriste oktalni brojevi?
- Dozvole datoteka na Linuxu i Macu. Naredba
chmod 755kaže tko smije što s datotekom. Prva znamenka je za vlasnika, druga za njegovu grupu, a treća za sve ostale. Svaka znamenka su tri bita: čitanje (4), pisanje (2) i pokretanje (1). Zato 7 = 4 + 2 + 1 znači sve, a 5 = 4 + 1 čitanje i pokretanje, bez pisanja. - Transponderi u avionima. Svaki avion kontroli leta šalje kod od četiri znamenke od 0 do 7, koji pilot namjesti na uređaju. Takvih kodova ima 8 · 8 · 8 · 8 = 4096. Neki su posebni: 7700 znači opasnost, a 7600 da ne radi radioveza.
- Stara računala. Računala iz 1960-ih, kao PDP-8, radila su s 12 bitova odjednom. Dvanaest bitova dijeli se na četiri skupine po tri, pa su programeri te brojeve pisali oktalno.
Brojevi u Arduino programu
Zapis u kodu
U C++ programu sustav broja određuje ono što piše ispred njega:
byte a = 200; // dekadski
byte b = 0b11001000; // binarni: 0b ispred
byte c = 0310; // oktalni: 0 ispred
byte d = 0xC8; // heksadecimalni: 0x ispred
Sve četiri varijable imaju istu vrijednost, 200. U starijim Arduino primjerima vidjet ćeš i binarni zapis B11001000. On radi samo u Arduinu, pa je bolje koristiti 0b.
Nula na početku broja
Broj koji počinje nulom C++ čita kao oktalni. Zato je 010 u programu osam, a ne deset. Ako vrijeme ili pin pišeš s nulom na početku da se lijepo poravna, kao 07 ili 09, dobit ćeš krivi broj ili grešku: 09 se ne može prevesti, jer 9 nije oktalna znamenka. Ispred dekadskih brojeva zato nikad ne piši nulu.
Ispis u serijskom monitoru
Program može ispisati broj u bilo kojem od ovih sustava. Ovaj program u serijskom monitoru ispiše brojeve od 0 do 16 u sva četiri sustava, kao tablica gore:
void setup() {
Serial.begin(9600);
Serial.println("DEC\tBIN\tOCT\tHEX");
for (byte n = 0; n <= 16; n++) {
Serial.print(n); // dekadski
Serial.print('\t'); // tabulator: razmak do sljedećeg stupca
Serial.print(n, BIN); // binarni
Serial.print('\t');
Serial.print(n, OCT); // oktalni
Serial.print('\t');
Serial.println(n, HEX); // heksadecimalni
}
}
void loop() {
}
Ispis ne počinje nulama: 5 ispiše kao 101, a ne kao 00000101.
Slika od bitova
LED matrica 8 × 8 ima osam redaka, a u svakom retku osam LED-ica. Jedan redak je zato točno jedan bajt: svaki bit kaže je li jedna LED-ica upaljena. Cijela slika je osam bajtova:
byte smajlic[8] = {
0b00111100,
0b01000010,
0b10100101,
0b10000001,
0b10100101,
0b10011001,
0b01000010,
0b00111100
};

0b00111100 je 0x3C.Jedan bit broja pročita funkcija bitRead(broj, mjesto). Mjesta se broje od 0, s desne strane: bitRead(0b00000100, 2) daje 1.
Koliko bitova ima varijabla?
Svaka vrsta varijable ima zadan broj bitova, pa i najveći broj koji može spremiti:
| Vrsta | Bitova | Raspon na Arduinu Uno | Najveći broj heksadecimalno |
|---|---|---|---|
byte | 8 | 0 do 255 | 0xFF |
int | 16 | −32 768 do 32 767 | 0x7FFF |
unsigned long | 32 | 0 do 4 294 967 295 | 0xFFFFFFFF |
Heksadecimalno se odmah vidi koliko bitova broj ima: svaka znamenka F su četiri jedinice.
Kad broj prijeđe najveću vrijednost, počne ispočetka, kao brojač kilometara u starom autu: byte koji ima 255 nakon + 1 ima 0. Zato vrijeme iz millis() spremamo u unsigned long (pogledaj lekciju Dva semafora na križanju).
I analogRead() vraća broj od 0 do 1023 zbog bitova: pretvornik u Arduinu ima 10 bitova, a s 10 bitova može se zapisati 1024 različita broja.
Što smo naučili?
- Binarni brojevi imaju samo dvije znamenke, 0 i 1. Svako mjesto vrijedi dva puta više od onoga desno od njega: 1, 2, 4, 8, 16…
- Jedna binarna znamenka je bit, četiri bita su nibl, a osam bitova je bajt, koji zapisuje brojeve od 0 do 255.
- Oktalni sustav ima znamenke od 0 do 7, a svaka je tri bita. Heksadecimalni ima znamenke od 0 do F, a svaka je četiri bita, jedan nibl, pa je bajt uvijek dvije heksadecimalne znamenke.
- U Arduino programu binarni broj pišemo s
0b, heksadecimalni s0x, a oktalni s nulom na početku. Zato ispred dekadskog broja nikad ne pišemo nulu. - Svaka varijabla ima zadan broj bitova. Kad broj prijeđe najveću vrijednost, počne ispočetka.
Mali kviz
1. Koji broj je binarno zapisan kao 1010?
2. Kako se binarno zapisuje broj 6?
3. Koliko različitih brojeva možeš složiti s pet kartica (od 0 nadalje)?
4. Koliko bitova ima nibl, a koliko nibla ima bajt?
5. Zapiši binarni broj 1111 0011 heksadecimalno.
0xF3).6. Koji je broj 0x1F dekadski?
7. U programu piše int a = 010;. Koliko je a?
8. Varijabla tipa byte ima vrijednost 255. Koliko ima nakon što joj dodaš 1?
9. Zašto analogRead() vraća brojeve od 0 do 1023?