[ Milan Aksic @ 06.09.2002. 06:05 ] @
No hardcore mathematics. Pretvaranje decimalnog u binarni broj. X(10) == ?(2) Decimalni broj se u binarni pretvara na sledeci nacin: Na primer broj 57 treba prevesti u binarni broj, onda se decimalni broj deli brojem 2, jer je baza binarnog broja 2, odnosno ima samo dve moguce vrednosti 1 ili 0. DEC - BIN -- 0 --- 0 -- 1 --- 1 -- 2 -- 10 -- 3 -- 11 -- 4 - 100 -- 5 - 101 -- 6 - 110 -- 7 - 111 ... Dake postupak je sledeci: 57 : 2 ostatat je 1 28 : 2 --------> 0 14 : 2 --------> 0 7 : 2 ---------> 1 3 : 2 ---------> 1 1 : 2 ---------> 1 Da bi se dobio tacan binarni zapis broja 57, dobijeni binarni broj (100111) treba 'izokrenuti'. Znaci prevedeni decimalni broj 57, u binarnom zapisu je broj 111001. Pretvaranje binarnog u decimalni broj. X(2) == ?(10) Binarni broj se prevodi u decimalni na sledeci nacin: Na primer broj 10011 treba prevesti u decimalni zapis. Onda je decimalni broj jednak zbiru, proizvoda svakog pojedinacnog broja u binarnom broju sa brojem 2 (2 je bazna osnova binarnog broja, postoje samo 2 broja 0 i 1) na stepen broja cifara u zapisu, minus jedan. Gde se svaki sledeci stepen dekrementuje za jedan (npr. 101 ima tri cifre, prvi stepen je 2 drugi 1 i treci 0). Primenjeno na broju 10011 postupak bi bio sledeci: 10011 = 1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 16 + 0 + 0 + 2 + 1 = 19 Pretvaranje decimalnog u hexadecimalni broj. X(10) == ?(16) Decimalni broj se u hexadecimalni broj prevodi na sledeci nacin: Na primer broj 32600 treba prevesti u hexadecimalni zapis, onda se broj 32600 deli brojem 16, ostatak je zadnja cifra u decimalnom zapisu a dobijeni broj se opet deli brojem 16 dok se ne dobije broj koji moze da se predstavi u hexadecimalnom sistemu. Decimalni zapis ima bazu 10, oktalni 8, binarni 2 a hexadecimlni imaju bazu 16. DEC - HEX -- 1 --- 1 -- 2 --- 2 -- 3 --- 3 -- 4 --- 4 -- 5 --- 5 -- 6 --- 6 -- 7 --- 7 -- 8 --- 8 -- 9 --- 9 - 10 --- A - 11 --- B - 12 --- C - 13 --- D - 14 --- E - 15 --- F - 16 -- 10 Znaci: 32600 / 16 = 2037 - ostatak je 8, 2037 / 16 = 127 --- ostatak je 5, 127 / 16 = 7 ------ ostatak je 15 (15 == F), i ovde deljenje prestaje jer se broj 7 moze hexadecimalno predstaviti. I ovoga puta, kao u slucaju izracunavanja binarnog broja, dobijeni broj (85F7) treba 'izokrenuti' da bi se dobio tacan hexadecimalni zapis broja 32600. Znaci, hexadecimalni zapis je broj 7F58. Prevodjenje hexadecimalnog u decimalni broj.X(16) == ?(10) Postupak prevodjenja hexadecimalnog broja u decimalni, je slican prevodjenju binarnog u decimalni. Decimalni broj je jednak zbiru, proizvoda svakog pojedinacnog broja u hexadecimalnom broju sa brojem 16 (16 je bazna osnova hexadecimalnog broja) na stepen broja cifara u zapisu, minus jedan. Gde se svaki sledeci stepen dekrementuje za jedan. So, postupak prevodjenja broja 58CDA6 je sledeci: 58CDA6 = 5 * 16 ^ 5 + 8 * 16 ^ 4 + C * 16 ^ 3 + D * 16 ^ 2 + A * 16 ^ 1 + 6 * 16 ^ 0 = 5242880 + 524288 + 49152 + 3328 + 160 + 6 = 5819814 I da preteram... Prevodjenje binarnog u hexadecimalni broj. X(2) == ?(16) Ovo prevodjenje je krajnje jednostavno, grupisu se po 4 bita u grupi. Na primer 11011001011: 0110 1100 1011 -- 6 -- 12 -- 11 6CB Prevodjenje hexadecimalnog u binarni broj. X(16) == ?(2) U ovom prevodjenju potrebno je grupisati po 4 binarne cifre za svaku cifru u hexadecimalnom broju. Na primer broj 5CDB6 5 == 0101 C == 1100 D == 1101 B == 1011 6 == 0110 Spajanjem ovih binarnih brojeva dobija se 1011100110110110110 I (AND) & daje tacan iskaz samo kada su oba operanda (ili bita tacni) Komplement (Inversion) ~ Suprotna vrednost. Postavice bit, ako bit nije bio postavljen i obrnuto Ponistavanje/proveravanje osmog bita se izvodi operatorom AND i komplementom od 128. Komplement od 128 (^128) postavlja sve njegove pojedinacne bitove na suprotne vrednosti, zato ako je 128 bio 1000 0000 komplement je 0111 1111. so: 1010 0110 1010 0110 AND 1111 1111 0111 1111 = 1010 0110 0010 0110 Samo proveravanje bitova bez ponistavanja se normalno, vrsi bez komplementa. Ili (OR) | daje tacan iskaz samo kada je jedan, ili oba operanda tacna. Bitovi se postavljaju/proveravaju operacijom maskiranja. Na primer ako postoji cetvorobajtni flag i treba postaviti osmi bit na TRUE, onda treba izvrsiti OR sa vrednoscu 128, jer je 128 u binarnom sistemu 1000 0000. 1 = 1 2 = 2 3 = 4 4 = 8 5 = 16 6 = 32 7 = 64 8 = 128 ... Broj ciji se bit postavlja je 1010 0110 0010 0110 (u decimalnom je 42534), so: 1010 0110 0010 0110 // binarni broj u kome treba postaviti osmi bit na TRUE OR 0000 0000 1000 0000 // 128, dodate su nule ispred = 1010 0110 1010 0110 Exkplicitno iili (XOR) ^ daje tacan iskaz samo kada su operandi razlicit. Ako treba promeniti bit u suprotnu vrednost, bez obzira koja je njegova vednost, koristi se operator exkluzivni OR. So, ako treba promeniti osmi onda se koristi operator ^ i broja 128. Situacija je sledeca: 1010 0110 1010 0110 ^ 0000 0000 1000 0000 = 1010 0110 0010 0110 Shiftovanje << >> Shift ulevo << Shift udesno >> Jednostavno pomeraju bitove ulevo ili udesno za zadati broj isunjavajuci ih nulama. So, pomeranjem broja 111 (7) za jedno mesto ulevo << dobija se 1110 (14). Dok se pomeranjem istog broja 111 (7) za jedno mesto udesno >> dobija broj 11 (3). Bit polja Bit polja su korisna onda kada je veoma bitno koliko se memorije koristi. Na primer struktura koja sadrzi datum i vreme nema potrebe da svaki clan deklarise kao unsigned short i time rezervise po 2 bajta memorije (16-bit tj. 2 bajta) ili cak unsigned int i time rezervise po 4 bajta memorije (32-bit sistemi 32-bit int == long tj. 4 bajta), umesto toga rezervise se samo onoliko koliko je potrebno: struct Format { unsigned Dan : 5, Mes : 4, God : 14, Sat : 4, Min : 6 }; So, rezervisano je 5 bita za Dan jer ce brojevi, koje ce predstavljati clan Dan biti u intervalu 1-31, a najveci moguci broj u tom slucaju bi bio broj 31, koji je u binarnom zapisu 11111, znaci zauzima 5 bita. Isto je za Mesec koji ce biti u intervalu brojeva 1-12, a (max) 12 je u binarnom zapisu 1100 znaci 4 bita, Minut je u intervalu 1-60 gde je (max) 60 u binarnom zapisu 111100 znaci 6 bita, and so on... ;o) Note: Zamolio da bih sve koje imaju neki komentar u vezi sa ovim textom, da isti ostave u posebnoj temi kako bi ova tema ostala pregledna. Hvala. |