Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Алгоритм деления


Skywalker ©   (2002-06-27 12:13:00) 

Кто-нибудь знает алгоритм деления двоичных чисел??


oleg_d   (2002-06-29 11:33:00) [1]

ну если ты о том делении что я думаю, так это существует множество машинных алгоритмов работы с двоичными числами, которые реализованы внутри самих железяк.
А это тебе надо посмотреть материалы по микропрограммированию.
Но сложноватая штука.


Skywalker   (2002-06-28 12:34:00) [2]

поскольку у меня идет деление на 2 то я сделал все проще
Quat=Num>>1; //это целая часть
Rem=Num-Quat*2 //это остаток


Digitman   (2002-06-27 14:46:00) [3]

Причем здесь расширенные регистры ? Они тоже - 32-разрядные ...
Как и макс.размер операндов инструкций DIV, IDIV ...

А целочисленные 64-разр. мат.операции для CPU, не имеющих соотв.встроенную поддержку, всегда эмулируются программно - иного выхода просто нет.

Посему открываешь файл _ll.asm (станд.поставка Делфи) и изучаешь, как это делается, например, в след.процедурах :

__lldiv (signed longlong division)
__lldivo (signed longlong division with overflow control)

все ж под рукой ! готовое причем ! )

и локализуется - заметь, как и все прочие "непонятности" - пошаговой трассировкой (с использованием окна CPU) простейшего кода :

var
a, b, c: Int64;
...
a:= $20000000000;
b:= $2;
c:= a div b;
showmessage(inttohex(c, 16));


AFROLOV   (2002-06-27 14:15:00) [4]

В процерах, помоему, стандартная операция зашитая в железо имеется.


Skywalker   (2002-06-27 14:08:00) [5]

2 Dijitman
это связано с моим предыдущем вопросом о функции ldiv в билдере, которая не смотря ни на какие аргументы выдает 32-битный результат...
вот я и хочу реализовать 64-битный аналог этой функции

IDIV надеюсь работает с расширенными регистрами?


Виктор Щербаков   (2002-06-27 14:04:00) [6]


> может кто лазил в дебри ассемблера?

Дык это в камень надо лезть а не в ассемблер.


Digitman   (2002-06-27 14:03:00) [7]

>Skywalker

Инструкции DIV, IDIV, FDIV и иже с ними.
И что это тебе дает ?


AFROLOV   (2002-06-27 14:02:00) [8]

Или если числа небольшие, то из битовой формы переводим числа a и b в стандартный тип (например Int64). Делим a/b=с - резултат имеет тип Int64= искомому результату деления. Остаток =a-b*c.


Skywalker   (2002-06-27 13:59:00) [9]

2 alxx> это тож сгодится на будущее :)

но меня интересует как это реализовано машинно...
может кто лазил в дебри ассемблера?


AFROLOV   (2002-06-27 13:56:00) [10]

Например тот, которому всех учили в школе. Ты его здесь и воспроизвел.


alxx   (2002-06-27 13:09:00) [11]

101101 | 10
- ------
10 |10110
-----
011
-
10
-----
10
10
-----
01

-----------------------------
101101/10 = 10110 и остаток 1


Digitman   (2002-06-27 13:04:00) [12]

а что ты под "двоичным числом" подразумеваешь ?


Виктор Щербаков   (2002-06-27 12:15:00) [13]

Столбиком.


Наверх

Титульная страница Поиск, карта сайта Написать письмо