|
![]() |
#1 |
...carpe diem...
Datum registracije: Jun 2006
Lokacija: Zagreb - okolica
Postovi: 1,363
|
Zadatak u programiranju-hitno
Postoji li možda neki kolega programer stručan u tome području. ![]() Radi se o nekim lakšim zadacima koje bi trebao do sutra riješiti jer imam vježbe,a programiranje mi je potpuna strano. Treba uzeti posljednje znamenke (npr. 3601) i zapisati ih u obliku dva dvoznamenkasta broja? (objasniti tak da mogu i kolegi riješiti njegov broj ![]() Zatim treba oduzeti drugi od prvoga broja primjenom tehnike dvojnog komplementa(neka mi netko i ovo objasni) sa prikazom binarnog broja u 8 bita sa predznakom i prikažite rezultat u binarnom, dekadskom,oktalnom i heksadekadskom brojevnom sustavu? Pa ako netko ima vremena onda bi mi to trebalo sutra do 9h. Hvala ![]() |
![]() |
![]() |
![]() |
#2 |
Premium
Datum registracije: Mar 2004
Lokacija: Bjelovar/Zagreb
Postovi: 357
|
1. Treba uzeti posljednje znamenke cega? Koliko posljednjih znamenki? Zapisati ih u obliku dva dvoznamenkasta broja? Dekadska dvoznamenkasta broja? Wtf? No dobro, recimo da smo napravili ovo pod tockom 1 i sad imamo dva binarna broja koja zelimo oduzeti tehnikom dvojnog komplementa. Zadano je da te brojeve prikazujemo u 8 bitova. Ajmo za primjer oduzeti brojeve 72 i 42. 72 zapisan binarno je 01001000 42 zapisan binarno je 00101010 Sada, uzmimo drugi broj i napravimo od njega dvojni komplement. To se radi u dva koraka: 1) zamijeni sve nule s jedinicama, a jedinice s nulama 2) dodaj mu 1 (dakle, zbroji ga s brojem 1) Znaci, imamo 00101010 Radimo zamjenu nula i jedinica i dodajemo 1 11010101 + 00000001 11010110 Dakle, dvojni komplement broja 00101010 (42) je broj 11010110 (214). Sada zbrojimo broj 01001000 (72) i dobiveni dvojni komplement 11010110 (214). 01001000 + 11010110 100011110 No, dobiveni broj nam ima 9 bitova. Zbog toga prvi bit bacamo u smece i kao dobiveni rezultat uzimamo 00011110. A to je 30. Dakle, tocno smo oduzeli... ![]() Zbrajanje binarnih brojeva radi se isto kao i zbrajanje dekadskih. Napisemo ih jednog ispod drugog, tako da nam se znamenke poklope. 0+0=0 0+1=1 1+0=1 1+1=10 (znaci, pisemo 0, a 1 ide dalje i zbraja se s brojevima u sljedecem koraku) Zadnje izmijenjeno od: munst0r. 28.03.2008. u 01:33. |
![]() |
![]() |
|
|
Oglas
|
|
![]() |
#3 |
Premium
Datum registracije: Mar 2004
Lokacija: Bjelovar/Zagreb
Postovi: 357
|
Pretvaranje iz jednog brojevnog sustava u drugi
Ajmo dobiveni broj 00011110 pretvoriti u dekadski, heksadekadski i oktalni sustav. 1) Iz binarnog u dekadski Indeksirajmo sve znamenke binarnog broja, krenuvsi od zadnje. Napisimo broj, a ispod svake znamenke njezin indeks. 0 0 0 1 1 1 1 0 7 6 5 4 3 2 1 0 Sada gledamo SAMO indekse ispod jedinica (one ispod nula zanemarujemo). Dakle, svaki od tih indeksa ispod jedinica stavimo "na" dvojku i izracunamo tu potenciju. Na kraju sve te dobivene potencije zbrojimo. Vjerojatno ti nista nije jasno iz ovih zadnjih par recenica. Ne znam kako da to objasnim rijecima. Ali nadam se da ce sve biti jasno nakon konretnog primjera: dekadski_broj = 2^1 + 2^2 + 2^3 + 2^4 = = 2 + 4 + 8 + 16 = = 30 Evo jos jedan primjer. Broj 01001000 (72) pretvaramo u dekadski broj: 0 1 0 0 1 0 0 0 7 6 5 4 3 2 1 0 dekadski_broj = 2^3 + 2^6 = = 8 + 64 = = 72 Dakle, gledamo samo one indekse (potencije) ispod jedinica. 2) Iz binarnog u heksadekadski Ovo je veoma jednostavno. Samo treba "zapamtiti" ovu tablicu (ne napamet, sve ide po redu i lako ju je izvesti na papiru u par sekundi): 0000 = 0 0001 = 1 0010 = 2 0011 = 3 0100 = 4 0101 = 5 0110 = 6 0111 = 7 1000 = 8 1001 = 9 1010 = A 1011 = B 1100 = C 1101 = D 1110 = E 1111 = F Nakon toga trebamo provjeriti da li nam je broj znamenaka binarnog broja djeljiv s 4. Ako nije, onda nadopisemo ispred nule po potrebi. Dakle, binarni broj mora biti napisan s 4, 8, 12, 16, ... znamenaka. Sada samo podijelimo broj na grupe po 4 znamenke i gledamo u tablicu. Primjer: Pretvaramo 00011110 u heksadekadski: 0001|1110 1E Ili 1001000 u heksadekadski zapis. Odmah primijetimo da imamo 7 znamenki, pa nepisemo jednu nulu ispred i grupiramo po 4 znamenke. 0100|1000 48 3) Iz dekadskog u binarni Idemo 72 pretvoriti u binarni broj. Ni ovo nije nista komplicirano. Radi se tako da cjelobrojno dijelimo broj s 2 dokle god ide. S obzirom da radimo cjelobrojno dijeljenje, necemo nikada dobiti decimalni broj, nego cijeli broj, a ostatak ce nam biti 0 ili 1. Dakle, sada necemo reci da je 5/2 = 2.5, nego 5/2 = 2 i ostatak 1 Ajmo to demonstrirati na 72. Ispod pisemo rezultat dijeljenja s 2, a desno ostatak. 72 | 0 36 | 0 18 | 0 09 | 1 04 | 0 02 | 0 01 | 1 I to je to. Sada samo prepisemo ove nule i jedinice odozdola i imamo 1001000. S obzirom da se u zadatku trazi prikaz na 8 bitova, onda jos dodamo nulu na pocetak i imamo: 01001000 Nemam sad vise vremena. Mozda nastavim nekada. Zadnje izmijenjeno od: munst0r. 28.03.2008. u 01:29. |
![]() |
![]() |
![]() |
#4 |
Registered User
Datum registracije: Mar 2008
Lokacija: ZG-DA
Postovi: 3
|
Zanimljivo, a kako bi bilo kada bi npr. imali broj 19 i 37, te moras oduzet veci broj od manjeg? Znaci sve je isto, prikaz binarnog broja u 8 bita sa predznakom. Jel onda radis dvojni komplement veceg broja pa oduzimas binarni broj 19 od dvojnog 37? Rezultat bi trebao biti -18 ne? |
![]() |
![]() |
![]() |
#5 |
Registered User
Datum registracije: Mar 2008
Lokacija: ZG-DA
Postovi: 3
|
Ajd da probam: znaci broj pretvorim u dvojni 19(10) = 00010011(2) broj je 37(10) = 00100101(2) pretvorimo broj 19(10) = 00010011(2) u dvojni 11111111 00010011 --------- 11101100 +1 --------- 11101101 e sad po ovome sto je munst0r napisao manji broj oduzmem od veceg 00100101 + 11101101 --------- 100010010 sto iznosi da je 18, a trebao bi biti -18, ako se 9bit izbacuje onda je MSB 0 sto znaci da je broj pozitivan? Kako Hexadecimalni broj prikazati kao negativan? isto vrijedi i za oktalni? Zadnje izmijenjeno od: expozed. 31.03.2008. u 14:58. |
![]() |
![]() |
![]() |
#6 |
Registered User
Datum registracije: Mar 2008
Lokacija: ZG-DA
Postovi: 3
|
Hah! Zaj*b ![]() nije kako sam naveo iznad vec kontra 19(10) = 00010011(2) broj 37(10) = 00100101(2) u dvojni pretvorimo broj 37(10) = 00100101(2) u dvojni 11111111 00100101 --------- 11011010 ..........+1 --------- 11011011 pa ispada da je 00010011 + 11011011 --------- 11101110 ako se pretvori taj broj u decimalni ispada: 11101110(2)=(-2)^7 + 2^6 + 2^5 + 2^3 + 2^2 + 2^1 = -128 + 110 = -18 ![]() isprike na 3 posta, ali nisam editirao da se vidi gdje grijesim ![]() |
![]() |
![]() |
![]() |
#7 | |
Premium
Datum registracije: Mar 2004
Lokacija: Bjelovar/Zagreb
Postovi: 357
|
Citiraj:
![]() Dok pretvaras iz binarnog broja u dekadski uvijek je 2^nesto. Ne moze biti -2 nikada. Sta da smo imali zapis na 9 bitova? Tada bi ti prvi bit bio na osmu potenciju. A to je pozitivan broj... A sad, da bi mogli reci na koji nacin ispravno oduzeti veci od manjeg binarnog broja, prvo moramo tocno definirati problem, tj. situaciju u kojoj se nalazimo (nacin na koji zapisujemo negativne binarne brojeve). 1. opcija: Negativne binarne brojeve zapisujemo isto kao i dekadske. Dakle, samo nakeljimo '-' ispred broja. U ovom slucaju je situacija prilicno jasna. Oduzimanje cemo obaviti isto kao sto bi to napravili i s dekadskim brojevima. Okrenut cemo redoslijed brojeva i normalno oduzeti manji od vecega. Zatim ispred rezultata samo nakeljimo - i eto nam rjesenja. No, moram reci da je ova siutacija dosta rijetka. Mozda nije neobicna negdje gdje se samo uci malo racunati s binarnim brojevima. Ali, u svijetu racunala takvo sto ne postoji. 2. opcija: Ne podrzavamo negativne binarne brojeve. To je kao da pri deklaraciji varijable u nekom programskom jeziku (koji to podrzava) stavimo "unsigned" (samo pozitivni brojevi). Primjer u C-u bi glasio: unsigned int pero; Dakle, ako koristimo 8 bita za prikaz broja, onda znaci da baratamo s brojevima iz raspona [0-255]. Ajmo to pokazati na primjeru. Racunamo 19 - 37. 19 = 00010011 37 = 00100101 Prvo nalazimo dvojni komplement od 37. 11011010 + 00000001 --------- 11011011 Sada zbrojimo 19 i dvojni komplement od 37. 00010011 + 11011011 --------- 11101110 = 238 Dobili smo 238. I u ovom slucaju je to sasvim ispravan rezultat i s njime vise nista ne treba raditi. Jedino, valja primijetiti da je 238 - (255 + 1) = -18. A to je upravo onaj rezultat koji bi ocekivali u dekadskom sustavu. 3. opcija: Prvi bit koristimo kao bit predznaka. Ako i sada koristimo 8 bitova za prikaz brojeva, onda mozemo raditi s rasponom [-128, 127] (opet je to 255 brojeva ukupno). No, sto tocno znaci da nam prvi bit predstavlja predznak? To znaci ako je taj bit 0, onda imamo pozitivan broj, a ako je 1, onda imamo negativan broj. No, necemo tu jedinicu samo zanemariti i razmisljati o njoj kao o obicnom minusu, a o ostalih 7 bitova kao o pravom broju, nego je i ta jedinica dio broja. Konkretno, to znaci sljedece. Ako imamo broj kojemu je prvi bit 0, onda je to najobicniji pozitivni binarni broj i mozemo ga odmah pretvoriti u dekadski broj (na dobro poznati nacin). No, ako je prvi bit 1, onda cemo prvo taj broj dvojno komplementirati i tek onda ga pretvoriti u dekadski broj. Evo primjera: (ovo je copy/paste prethodnog primjera s malo dodatka na kraju) Racunamo 19 - 37. 19 = 00010011 37 = 00100101 Prvo nalazimo dvojni komplement od 37. 11011010 + 00000001 --------- 11011011 Sada zbrojimo 19 i dvojni komplement od 37. 00010011 + 11011011 --------- 11101110 Dobili smo nas rezultat, ali vidimo da je prvi bit 1, pa cemo ga dvojno komplementirati prije pretvorbe u dekadski sustav. Komplement je 00010010. A to je broj 18. Naravno, mi znamo da je on negativan, pa mozemo napisati -18. |
|
![]() |
![]() |
![]() |
#8 | |
prcknedl
Datum registracije: Dec 2005
Lokacija: Zagreb
Postovi: 3,131
|
Citiraj:
Dvije zadnje znamenke dobijes pomocu mod 100, u Pascalu to izgleda ovako: br1:=pocetni_br div 100. Dobijes 1 jer je to ostatak od dijeljenja pocetnog broja sa 100. Druge dvije znamenke dobijes ovako: prvo napravis pocetni_broj:= pocetni_broj div 100 kako bi se rijesio zadnjih dviju znamenaka koj si vec obradio i zatim kao i u gornjem primjeru nadjes zadnje dvije pomocu mod. Za ovo ti broj mora biti integer. Zadnje izmijenjeno od: Matesonik. 01.04.2008. u 02:15. |
|
![]() |
![]() |
![]() |
#9 | |
Premium
Datum registracije: Mar 2004
Lokacija: Bjelovar/Zagreb
Postovi: 357
|
Citiraj:
Je, sve ok. Osim sto si zamijenio DIV i MOD... ![]() DIV je cjelobrojno dijeljenje. MOD je ostatak cjelobrojnog dijeljenja. Ako zelimo zadnje dvije znamenke, onda ih dobimo sa MOD 100. A uklonimo ih sa DIV 100 (broj podijelimo sa 100, a necemo dobiti decimalni broj jer je to cjelobrojno dijeljenje). I naravno, kljucne rijeci DIV i MOD vrijede samo za Pascal... |
|
![]() |
![]() |
![]() |
#10 | |
prcknedl
Datum registracije: Dec 2005
Lokacija: Zagreb
Postovi: 3,131
|
Citiraj:
![]() ![]() |
|
![]() |
![]() |
|
|
Oglas
|
|
![]() |
#13 |
Premium
Datum registracije: Mar 2007
Lokacija: Zg
Postovi: 660
|
ja mislio da je to novi post.. nisam gledo datum jer m ije frend sam poslo link od toga... pa sam mislio da je to novijeg datuma, al sad vidim da sam ovo izvuko iz arhive masne... sry mods ![]()
__________________
nek sam isti kao on, ma nek sam isti ko stari moj, dok zivot juri, ja cu lagano.... ![]() |
![]() |
![]() |
|
|
Oglas
|
|
![]() |
Uređivanje | |
|
|