Problem sa operatorima za bitove

1

Problem sa operatorima za bitove

offline
  • 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.
offline
  • 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. Mr. Green
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.



offline
  • Pridružio: 15 Maj 2012
  • Poruke: 396

Hvala ti puno, sve sam ukapirao, i procitao za operatore, provezbao sam nekoliko zadataka i uspeo.
Hvala ti puno! Ziveli Ziveli

EDIT:
Jedino sto mi nije jasno, je ovo sto se pise unutar zagrada main funkcije. Mozes li da mi to objasnis ako imas vreme?

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Citat:
Jedino sto mi nije jasno, je ovo sto se pise unutar zagrada main funkcije. Mozes li da mi to objasnis ako imas vreme?


To se zove command line parameters.

int main(int argc, char* argv[]) argc -> broj argumenata argv -> argumenti

Neki program mozes pokrenuti preko "konzole" i proslediti mu parametre.
Na windows-u recimo ides ovako:
1. Ides na Start meni i kucas "cmd"


2. Pokrecemo recimo Notepad posto on recimo cita te argumente (kao i vecina programa):


Znaci ovde imamo 2 argumenta/parametra. Prvi je uvek ime programa (Notepad) a drugi je ime fajla koji ce da otvori.

U nasem prvom primeru treba da pozoves tvoju konzolnu aplikaciju (program) i prosledis 5 parametara:
MojProjekat 2013 4 30 15 58

MojProjekat -> argv[0] -> ime programa 2013 -> argv[1] -> godina 4 -> argv[2] -> mesec ... itd

Ako koristis Visual Studio mozes postaviti u podesavanjima projekta te parametre da ne bi non-stop pozivao konzolu tokom testiranja:

Verovatno i drugi IDE-i imaju slicno.

Mada ne moras ovako da radis, mozes da uzmes ulaz i sa tastature. Ovo je cisto informativno jer ces se sigurno susresti i sa ovim.

offline
  • Pridružio: 15 Maj 2012
  • Poruke: 396

Ok, hvala ti puno!
Ziveli Ziveli

EDIT:
I da, da li ovaj Visual Studio sto imas kod tebe si kupio ili je to trial verzija sa Microsofta 90 dana?

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Napisano: 30 Apr 2013 16:21


Da, kupio sam. Hehe... Mr. Green
Dobra ti je i Express verzija ako ces da koristis. Ne znam kako je sad, moglo je pre da se samo registruje (free) da ne bude trial.
Samo neke nerelevantne stvari fale za razliku od non-free verzija.

Dopuna: 30 Apr 2013 16:25

Vidim iz profila da imas 14 godina, OMG. Shocked
Ja ti zavidim sto si poceo na vreme sa programiranjem jer sam se ja veoma kasno "opametio". Samo tako nastavi. Ziveli

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

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.

offline
  • Pridružio: 15 Maj 2012
  • Poruke: 396

Napisano: 30 Apr 2013 16:42

Hvala ti. Ziveli

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.

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Kako nema, majku mu Mr. Green

http://go.microsoft.com/?linkid=9709949

Što mora baš 2012, može i 2010 Smile Inače u Visual C++ možeš da radiš i sa C i sa C++. Ja bih ti preporučio da ga imaš jer je stvarno dobar, a to će ti reći i iskusniji programeri od mene i tebe Wink Plus, ne pravi mnogo mesta ,kao što to čini ceo Visual Studio.

offline
  • 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?

Ko je trenutno na forumu
 

Ukupno su 1142 korisnika na forumu :: 32 registrovanih, 5 sakrivenih i 1105 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Apok, bojank, BORUTUS, crnitrn, darionis, Dimitrise93, djboj, FileFinder, galerija, hatman, Leonov, Mcdado, mercedesamg, milan.vukovic, Milos ZA, Milos82, Mlav, mnn2, MrNo, mustangkg, nemkea71, panzerwaffe, procesor, rodoljub, Sirius, SlaKoj, Srle993, stegonosa, suton, tomigun, Trpe Grozni, wizzardone