![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм деления
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]Столбиком.