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

Pomeranje bitova ulevo i udesno; negativni brojevi; interpolirano pretraživanje

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pomeranje bitova ulevo i udesno; negativni brojevi; interpolirano pretraživanje

[ Pregleda: 4860 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

cokoladna_bananica
ne radim
ne radim
Beograd

Član broj: 321938
Poruke: 1
*.dynamic.sbb.rs.



Profil

icon Pomeranje bitova ulevo i udesno; negativni brojevi; interpolirano pretraživanje11.03.2014. u 01:00 - pre 122 meseci
Zdravo.Treba mi pomoc oko nekih zadataka u C-u,konkretno zadatak 10<<3-10>>2 kao i objasnjenje kako ste dosli do resenja?Zbunjuje me kako -7 da predstavim kao binaran broj?I kako onda dalje?
A drugo pitanje je u vezi interpoliranog pretrazivanja(ako moze i neko objasnjenje na koji nacin se odvija interpolirano pretrazivanje),da li se moze primeniti na niz brojeva 101,203,305,407,405,313,210,102?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.3gnet.mts.telekom.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pomeranje bitova ulevo i udesno; negativni brojevi; interpolirano pretraživanje11.03.2014. u 12:12 - pre 122 meseci
Citat:

Treba mi pomoc oko nekih zadataka u C-u,konkretno zadatak 10<<3-10>>2 kao i objasnjenje kako ste dosli do resenja?

Prvo treba utvrditi da li treba uraditi ovo (10<<3)-(10>>2), ili ovo 10<<(3-10)>>2, što je ekvivalentno sa 10<<3-10>>2.

Ako se radi o prvom:

Fizički gledano, izraz 10<<3 označava da cifre broja 10, zapisane u binarnom obliku, treba pomeriti za TRI (3) mesta ULEVO (<<), dopisivanjem nula sa desne strane.

Dakle, početni broj:
10 (Dec) = 1010 (Bin)

I pomeranje:
1010 (Bin), sada je to broj 10100 (20)
II pomeranje:
10100 (Bin), sada je to broj 101000 (40)
III pomeranje:
101000 (Bin), sada je to broj 1010000 (80)

Logički gledano, broj 10 si pomnožio sa 23, tj sa 8. Zapravo, svako pomeranje ulevo je množenje broja sa 2.

Pomeranje udesno je zapravo deljenje sa 2. Isti je princip pomeranja, samo udesno. Ipak, treba voditi računa da se ne izgubi "bit najmanje težine", tj onaj prvi bit sa desne strane, ako je broj neparan. Ovo je slučaj i u tvom primeru, kod drugog pomeranja.

Ako se radi o drugom:
Citat:

Zbunjuje me kako -7 da predstavim kao binaran broj?I kako onda dalje?

Negativni brojevi se ne mogu zapisati na očekivani način u binarnom svetu, jer imaš na raspolaganju samo 0 i 1. Nemaš znak "-". Kako će se reprezentovati negativni brojevi, stvar je neke konvencije (dogovora). Recimo da se "bit najviše težine" rezerviše da označava da i je broj pozitivan ili negativan. Time automatski gubiš "kapacitet" za smeštanje vrednosti, ali šta je tu je.

Ima i drugačijih načina, verovatno je tvoj slučaj:
http://sr.wikipedia.org/wiki/Komplement_dvojke
Tvoj -7 se po ovome transformiše u ...11111001.

Kakvi će rezultati biti, zavisi od "veličine" izabranog tipa.


Citat:

A drugo pitanje je u vezi interpoliranog pretrazivanja(ako moze i neko objasnjenje na koji nacin se odvija interpolirano pretrazivanje),da li se moze primeniti na niz brojeva 101,203,305,407,405,313,210,102?

Čim postoji pravilo - može.
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.dynamic.isp.telekom.rs.

ICQ: 208550327


+14 Profil

icon Re: Pomeranje bitova ulevo i udesno; negativni brojevi; interpolirano pretraživanje11.03.2014. u 12:28 - pre 122 meseci
Moje misljenje je da bi trebalo uraditi:

Citat:
Prvo treba utvrditi da li treba uraditi ovo (10<<3)-(10>>2)


na ovaj nacin zato sto shift operatori rade sa pozitivnim brojevima (compiler daje samo warning, mozda bi trebao biti malo stroziji), posto je - jaci od << i >>.
EOF
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Pomeranje bitova ulevo i udesno; negativni brojevi; interpolirano pretraživanje11.03.2014. u 13:09 - pre 122 meseci
Kompajler daje upozorenje, ali se program kompajlira i dobija se odgovor da je rezultat 0.

Dakle, izraz koji si ti napisao - 10<<3-10>>2 se izračunava kao ( ( 10 ) << ( 3 - 10 ) ) >> 2 i rezultat je 0.
Znači, prvo se izračunava izraz 3-10 i rezultat je -7. Ovaj rezultat se pamti kao drugi komplement, odnosno kao 2^32 - 7 ili 2^64 - 7 u zavisnosti da li se koriste 32-bitni ili 64-bitni itegeri. Iako je rezultat integer, za potrebe shift operacije taj broj se tretira kao unsigned, a svaki levi šift koji je veći ili jednak 32 ili 64 u zavisnosti od dužine integera će kao rezultat dati 0 (zato što je najmanji integer veći od 0 jednak 1, a kada se on šiftuje 32 ili 64 mesta u levo, "ispada" iz opsega brojeva koji se mogu prikazati u integer tipu, pa postaje 0). Kada se 0 šiftuje u desno, bez obzira koliko cifara, opet je rezultat 0.

U slučaju da si hteo da izračunaš (10<<3)-(10>>2), rezultat je 78, zato što je 10 << 3 jednako 80, a 10 >> 2 je 2, pa je 80 - 2 = 78.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pomeranje bitova ulevo i udesno; negativni brojevi; interpolirano pretraživanje

[ Pregleda: 4860 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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