Dělení 32bit/16bit číslem

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Izmail
Příspěvky: 157
Registrován: 26 zář 2008, 02:00

Dělení 32bit/16bit číslem

#1 Příspěvek od Izmail »

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(a) Izmail dne 08 kvě 2009, 15:26, celkem upraveno 1 x.

Uživatelský avatar
Bernard
Příspěvky: 3614
Registrován: 27 kvě 2005, 02:00

#2 Příspěvek od Bernard »

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.

Uživatelský avatar
Izmail
Příspěvky: 157
Registrován: 26 zář 2008, 02:00

#3 Příspěvek od Izmail »

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 píše: A tak z dělení je nakonec odčítání, trochu rozhodování a plno operací čtení a zápisu.
Nechapu, jak odcitani?

Uživatelský avatar
Bernard
Příspěvky: 3614
Registrován: 27 kvě 2005, 02:00

#4 Příspěvek od Bernard »

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:

00111011 10011010 11001010 00000000 (miliarda)

00011111 10111101 00000000 00000000 (65.000 x 2^13)
-----------------------------------------------
00011011 11011101 11001010 00000000 výsl: 00000000 00000000 00100000 00000000

A jdeme dál:

00011011 11011101 11001010 00000000 (minulý zbytek)

00001111 11011110 10000000 00000000 (65.000 x 2^12)
------------------------------------------------
00001011 11111111 01001010 00000000 výsl. 00000000 00000000 00110000 00000000

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.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“