Zaslal: pá květen 08 2009, 11:26 Předmět: Dělení 32bit/16bit číslem
Ahoj,
chtěl jsem se zeptat, nevíte jak napsat program, který bi dělil 32bit/16bit číslo. Na internetu jsou těch programů mraky, jeden mám, funguje, ale ani opakujícím se krokováním pořád nechápu princip.
Zde
http://www.volny.cz/rotterp/as5132bitovedeleni.htm
jsem četl, že to můžu dělit, jako dekadicka čísla pod sebou, což na papíře jde kdybych dělil 16bit/8bit i do programu se mi to podarilo zapsat. ALe jak udelat 32bit/16bit to netusim. Nejde mi ani tak o rychlost programu jako spis o to, aby to bylo zrejme.
Děkuji za radu
Naposledy upravil Izmail dne pá květen 08 2009, 14:26, celkově upraveno 1 krát.
Když se dohodneme, že obě čísla - jak 32bitové tak 16bitové - jsou čísla celá, tak jaký problém. Jednoduše číslo, které může být nejvíc 4.294.967.295 dělíš číslem, které je nejvíc 65.535. Jediná komplikace je asi v tom, že se programuje v assembleru, dělení má provést 8-bitový procesor, takže dělenec zabírá 4 paměťová místa, dělitel 2 a pro podíl třeba rezervovat také 4 - co kdyby se dělilo jednotkou. A tak z dělení je nakonec odčítání, trochu rozhodování a plno operací čtení a zápisu.
Ano, jsou to vsechno cela cisla ale problem vidim v tom, jak to zapsat do programu, kdyz do delim postupne jako na papire, tak delim prvne prvni cast delence delitelem, ale jak mam delit 16bitovim delitelem?
Bernard napsal(a):
A tak z dělení je nakonec odčítání, trochu rozhodování a plno operací čtení a zápisu.
Nikoho nechci podceňovat, jen to podat názorně, tedy:
Dělení je opakované odčítání, například dekadicky 101:2 znamená, že odpočítávám dvojku, dokud to jde: 99,97,95.....31,29...........3,1 a dost. Kolikrát se podařilo odčítat? 50x, tak výsledek je 50.
Máme ale rychlejší postup, budeme odčítat 20 místo 2:
81,61,41,21,1 a dost. Podařilo se 5x , ale výsledek je 10x větší, zase 50.
A tímto principem dělíme i binární čísla.
Příklad: 1.000.000.000 : 65.000 = ?
00111011 10011010 11001010 00000000 (miliarda)
00000000 00000000 11111101 11101000 (65.000)
Aby byl výpočet rychlejší, budeme zkoušet odečítat násobek 65000 x 2^n, a to n tak velké, jak to jde.
00111011 10011010 11001010 00000000 (miliarda)
00111111 01111010 00000000 00000000 (65.000 x 2^14)
Teď jsou jednotky nejvyšších řádů pod sebou. ale odečítáme větší číslo od menšího, tak jsme přestřelili. Znovu:
A tak dál. Když se odečítat dá, ve výsledku se na tom řádě n objeví 1, jinak 0. Když je n=0, je poslední pokus odečíst těch 65000, co zůstane, je zbytek.
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.