Kad god radiš sa grafikom, nije zgoreg malo crtati, obično se tako sve razjasni.
Dakle, gledaj priloženu sliku.
Recimo da je na slici taj tvoj "ekran" iz primjera, širine 40 pixela/tačaka/elemenata... i visine 60.
On je predstavljen dvodimenzionalnim nizom čiji su elementi char:
char graphics[5][60]
Obrati pažnju da je jedan char veličine jednog byte-a, tj ima 8 bitova, zato jedan char element iz tvog niza
graphics pokriva 8 tačaka na ekranu,
jer je svakoj tački pridružen jedan bit.
Na slici vidiš iscrtane char-ove debljim crnim boxovima.
Ti pojedinačnim tačkama ne možeš da pristupaš pojedinačno (jer jezik C ne poznaje manje elemente od byte-a) - nego moraš da se bakćeš sa čitavim char-om (byte-om) u kome se posmatrana tačka nalazi.
Fazon na kome se to bazira je taj da u nekom byte-u možeš da promjeniš vrednost nekog bita, ali tako da ne utičeš na vrednost ostalih bitova u tom bajtu.
Dakle, kad želiš da promjeniš vrednost nekog bita(tačke) na ekranu, ti prvo moraš da pristupiš tom byte-u u kome se ona nalazi.
Na slici su adrese bajtova(char-ova) predstavljene plavom bojom.
Tako npr. vidiš dva zaplavljena char-a, jedan je
graphics[0][5], a drugi
graphics[3][7].
Kada recimo hoćeš da čeprkaš sa tačkom ekrana na koordinati (20,12), onda moraš u stvari da čeprkaš sa char-om graphics[2][12] jer je to onaj u kome
se nalazi ta tačka.
Pošto jedan char pokriva 8 horizontalnih tačaka (vidi sliku), to kad podjeliš koordinatu x sa 8 dobićeš prvu dimenziju dvodimenzionalnog niza graphics.
Pošto jedan char po vertikali pokriva samo jednu tačku (vidi sliku), to je druga koordinata direktno i druga dimenzija niza dvodimenzionalnog niza graphics.
Znači, sa graphics[2][12] ti si "dohvatio" potreban char (žuti blok na slici).
Sad je samo potrebno setovati odgovarajući bit u tom char-u, tj. byte-u.
To se radi pomoću bit operatora.
Setovanje nekog bita zasniva se na principu da bilo koja vrednost tog bita kada se OR-uje sa "1" daje za rezultat "1".
Što se tiče ostalih bitova - koji treba da ostanu nepromjenjeni, oni treba da se OR-uju sa "0", jer kad se bilo šta OR-uje sa "0" ono ostaje ono što je i bilo.
Recimo, ako u nekom bajtu hoćeš da setuješ 3 bit (sa početka) onda to ide ovako:
Code:
neki_byte |= 0b00100000;
Dakle, potrebno je da ga OR-uješ sa bit-maskom koja ima "1" na trećoj poziciji, a na svim ostalim nula.
Ono gore na desnoj strani je binarni broj, i takav zapis nije standard C jezika i mnogi kompajleri ga ne podržavaju, ali je npr. uobičajeno da postoji u kompajlerima za mikrokontrolere i sl.
Zbog toga takve brojeve moraš da pišeš ili u heksadecimalnom, ili u oktalnom ili u decimalnom zapisu.
Recimo, u heksadecimalnom zapisu to je 0x20, a u decimalnom 32.
Da bi izračunao tačnu poziciju tvoje tačke u okviru posmatranog byte, koristi se deljenje po modulu:
Code:
x%8
Dobijeni broj predstavlja poziciju bita (u okviru char-a) koji treba da se setuje.
Da bi dobio bit-masku koja samo na toj poziciji ima "1", a na svim ostalim "0", polaziš od broja koji samo na prvoj poziciji ima "1":
0x80 heksidecimalno je ustvari
10000000 binarno
Kada sad taj broj shift-uješ u desno za 4 mjesta dobijaš
00001000
To je ta bit maska koja ti treba. Pogledaj sliku, to je mjesto na kom se nalazi onaj crveni kvadratić koji predstavlja tu tačku sa koordinatama (20,12). Kada svoj orginalni byte OR-uješ sa ovim, onaj bit koji se poklopa sa "1" iz ove bit-maske će biti setovan, a svi ostali nepromjenjeni (pošto se OR-uju sa "0", što nema nikakav efekt u OR operaciji).
Kada hoćeš da resetuješ neki bit, koristiš komplementarnu operaciju AND.
U tom slučaju bit maska sa kojom AND-uješ svoj byte treba da sadrži nule na onim mjestima na kojima hoćeš da ti se bitovi resetuju,
a jedinice na mjestima onih bitova koji hoćeš da ostanu nepromjenjeni.
Npr. nakon ovoga
Code:
neki_byte &= 0b01111110; //bin
tj.
neki_byte &=0x7E; // hex
tvoj bajt će imati resetovane bitove na prvoj i zadnjoj poziciji, a svi ostali će ostati nepromjenjeni jer AND-ovanje nečeg sa "1" ne mijenja ništa:
0 AND 1 =
0
1 AND 1 =
1
[Ovu poruku je menjao Odin D. dana 17.10.2014. u 19:30 GMT+1]