Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Bitovi u C/C++ - HOWTO

[es] :: C/C++ programiranje :: Bitovi u C/C++ - HOWTO

[ Pregleda: 4708 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milan Aksic

Član broj: 412
Poruke: 1053
*.beotel.net



Profil

icon Bitovi u C/C++ - HOWTO06.09.2002. u 06:05 - pre 244 meseci
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.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Bitovi u C/C++ - HOWTO

[ Pregleda: 4708 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.