Poslao: 30 Apr 2013 09:26
|
offline
- crusher

- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Dugo nisam bio na forumu, pa sam se vratio. I imam jedan problem sa bitovima.
Kupio sam zbirku zadataka sa resenjima od Lasla Krausa i ima jedan zadatak koji glasi ovako:
Vreme se zadaje pomocu broja godina, meseca, dana, sata i minuta. Napisati na jeziku C program za pakovanje i obnuri proces raspakivanja podataka o vremenu u jednu 32-bitnu celobrojnu promenljivu. Potrebne podatke citati sa glavnog ulaza racunara, a rezultate prikazati na glavnom izlazu racunara.
I sada ja sve lepo uradim, ali kada dodjem do ovog dela koda, onda se zbunim i nerazumem sta se u tom delu desava:
vreme = (usnigned long) godina << 20 |
(unsigned long) mesec << 16 |
dan << 11 | sat << 6 | minut;
E sada, sta rade ovi operatori i ostali(<<, >>, |, &, ~).
Mozete li mi objasniti zasto se koriste, kada se koriste, kako se koriste, i neki primer?
Hvala unapred!
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 30 Apr 2013 12:26
|
offline
- morando

- Građanin
- Pridružio: 19 Maj 2011
- Poruke: 297
|
Napisano: 30 Apr 2013 10:20
Pokusacu ja, pa nek' se neko jos ubaci ako treba.
Znaci imas godinu, lupam 1937:
// 32 bit-a, 8 x 4 "polja"
00000000 00000000 00000111 10010001 // godina 1937 binarno
i gore ti pise da siftujes u levo 20, znaci pomeras sve u levo 20 bit-nih "polja":
<----------------------------
01111001 00010000 00000000 00000000
Posle imas sift za mesec, dan i sate, ali stim Sift operator ima prednost nad or-om | , znaci lupam mesec 4 (april):
00000000 00000000 00000000 00000100 // mesec = 4
<----------------------
00000000 00000100 00000000 00000000 // mesec << 16
godina OR mesec
01111001 00010000 00000000 00000000 // godina 1937 OR |
00000000 00000100 00000000 00000000 // mesec 4
-----------------------------------------------
01111001 00010100 00000000 00000000
I tako isto nastavis za dan, sat i minut....
Imas krs tutorijala na net-u kako se koji operator koristi. Primer.
EDIT:
operator SHIFT << n
Znaci pomeras u levo n polja.
00000010 // orginal
00001000 // orginal << 2
operator SHIFT >> n
Znaci pomeras u desno n polja.
00101000 // orginal
00001010 // orginal >> 2
operator AND &
00010010 // var1
00000010 // var2
-----------
00000010
Znaci samo ako su oba 1 onda je rezlutat 1 u suprotnom 0
operator OR |
00011010 // var1
01000000 // var2
-----------
01011010
Znaci ako je bar jedan 1 onda je rezlutat 1 u suprotnom 0
operator ~
00011010 // var1
11100101 // ~var1
Znaci izvrce bit-ove, ako je 1 onda je 0 a ako je 0 onda je 1.
Dopuna: 30 Apr 2013 11:36
Jos malo detalja.
Ako se pitas zasto se siftuje (pomera), pokusacu da objasnim.
Uzecu prvo godinu, znaci siftuje se 20 polja sto znaci da ima 12 bit-a (od 32) rezervisano za neki broj godine.
U tih 12 bit-a, maximalan broj koji moze da se reprezentuje je 4095 (111111111111 -> 12x1) sto je sasvim dovoljno jer je ionako ta godina veoma daleko.
Citat:
// postavicu bit-ove kao X
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX // rezervisan prostor za broj godine
Onda ide mesec koji se siftuje u levo 16 polja, maximalan broj meseca je 12 (1100) sto znaci da je sasvim dovoljno 4 bit-a za tu promenljivu.
Citat:
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
Sledeci ide dan koji se siftuje u levo 11 polja, maximalan broj je 31 (11111) sto znaci da je dovoljno 5 bit-a.
Citat:
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
Onda ide sat koji se siftuje u levo 6 polja, maximalan broj je 23 (10111) sto znaci da je dovoljno 5 bit-a.
Citat:
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
I ostatak je za minute, ostalo je 6 bit-a slobodno, maximalan broj minuta je 59 (111011) sto znaci da staje.
Dopuna: 30 Apr 2013 12:26
Tvoj primer plus obrnuti procesa, ako ti neko da vreme a moras da raspakujes vrednosti za godinu, mesec, dan...
#include <stdlib.h>
#include <stdio.h>
typedef unsigned long ulong;
#define MASK_GODINA 4293918720ul // 11111111 11110000 00000000 00000000
#define MASK_MESEC 983040ul // 00000000 00001111 00000000 00000000
#define MASK_DAN 63488ul // 00000000 00000000 11111000 00000000
#define MASK_SAT 1984ul // 00000000 00000000 00000111 11000000
#define MASK_MINUT 63ul // 00000000 00000000 00000000 00111111
#define SHIFT_GODINE 20ul
#define SHIFT_MESEC 16ul
#define SHIFT_DAN 11ul
#define SHIFT_SAT 6ul
typedef struct TAG_VREME
{
ulong godina;
ulong mesec;
ulong dan;
ulong sat;
ulong minut;
}VREME;
int main(int argc, char* argv[])
{
// pakovanje
VREME v1;
sscanf(argv[1], "%u", &v1.godina);
sscanf(argv[2], "%u", &v1.mesec);
sscanf(argv[3], "%u", &v1.dan);
sscanf(argv[4], "%u", &v1.sat);
sscanf(argv[5], "%u", &v1.minut);
ulong vreme = v1.godina << SHIFT_GODINE | v1.mesec << SHIFT_MESEC | v1.dan << SHIFT_DAN | v1.sat << SHIFT_SAT | v1.minut;
// raspakivanje
VREME v2;
v2.godina = (vreme & MASK_GODINA) >> SHIFT_GODINE;
v2.mesec = (vreme & MASK_MESEC) >> SHIFT_MESEC;
v2.dan = (vreme & MASK_DAN) >> SHIFT_DAN;
v2.sat = (vreme & MASK_SAT) >> SHIFT_SAT;
v2.minut = vreme & MASK_MINUT;
printf("Godina: %u\nMesec: %u\nDan: %u\nSat: %u\nMinut: %u", v2.godina, v2.mesec, v2.dan, v2.sat, v2.minut);
return 0;
}
Ako nesto nije jasno slobodno pitaj, mada bi trebalo da razumes kad vidis kako koji operator radi.
|
|
|
|
|
|
|
|
Poslao: 30 Apr 2013 16:41
|
offline
- E.L.I.T.E.

- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4576
|
morando ::Ne znam kako je sad, moglo je pre da se samo registruje (free) da ne bude trial.
I sad može preko Hotmail-a, reguješ se, dobiješ serijski kod, ukucaš i to ti je to. Čak taj kod možeš koristiti i više puta odjednom.
|
|
|
|
Poslao: 30 Apr 2013 16:44
|
offline
- crusher

- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Napisano: 30 Apr 2013 16:42
Hvala ti.
Dopuna: 30 Apr 2013 16:44
E.L.I.T.E. ::morando ::Ne znam kako je sad, moglo je pre da se samo registruje (free) da ne bude trial.
I sad može preko Hotmail-a, reguješ se, dobiješ serijski kod, ukucaš i to ti je to. Čak taj kod možeš koristiti i više puta odjednom.
Znam, probao sam na Visual Studio Express i mogao sam da koristim stalno, ali nema sad ono sto treba za C i ostale programske jezike, ima samo za VB. Zato sam hteo ovaj Visual Studio Ultimate 2012 ali akd se registruje dobije se samo za 90 dana.
|
|
|
|
|
Poslao: 30 Apr 2013 17:54
|
offline
- crusher

- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Napisano: 30 Apr 2013 16:49
Moze i 2010, nebitno mi je to. Evo skinuo sam Visual Studio C++ i instaliram ga sad.
Dopuna: 30 Apr 2013 17:54
Instalirao sam i pokrenuo. Pokrenuo sam Empty Project da uradin neki program samo da isprobam. Pokrenem, stavim ime i sad imam sa leve strane External Dependencies, Header Files, Resource Files, Source Files, a na sredini mi samo stoji plavo i nemogu da kucam kod.
Sta treba da uradim da mogu da kucam kod?
|
|
|
|