реклама на сайте
подробности

 
 
> Деление 24-битного на 3-битное?, Дайте пример
alux
сообщение May 12 2005, 14:43
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Как поделить 24-битное число на трехбитное без остатка? Поделитесь примерами. Есть пример 16/16. Как его использовать для моего случая?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
yung
сообщение May 13 2005, 04:34
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



Если больше ничего в голову не приходит, то предложу решение в лоб. Требуется процедура умножения 16х16 (результат нужен 32-разрядный, такую процедуру атмеловцы в примерах дают). Берется тестовое число 0х800000.
Умножается на делитель (3- разрядный). Сравнивается с 24-разрядным делимым. А далее по теории методом половинного деления. Долго, но работает. В принципе для ускорения можно свою процедуру умножения 24*3 сделать, пусть даже методом сложения. Я когда-то так на ассемблере с 16-битными данными работал.
Go to the top of the page
 
+Quote Post
indela
сообщение May 14 2005, 14:00
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 50
Регистрация: 13-03-05
Из: Минск
Пользователь №: 3 309



здесь общий смысл деления можно понять и адаптировать для нужной разрядности делителя


;***************************************************************************
;*
;* "div16u" - 16/16 Bit Unsigned Division
;*
;* This subroutine divides the two 16-bit numbers
;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).
;* The result is placed in "dres16uH:dres16uL" and the remainder in
;* "drem16uH:drem16uL".
;*
;* Number of words :19
;* Number of cycles :235/251 (Min/Max)
;* Low registers used :2 (drem16uL,drem16uH)
;* High registers used :5 (dres16uL/byte,dres16uH/byteH,dv16uL,dv16uH,
;* dcnt16u)
;*
;***************************************************************************

;***** Subroutine Register Variables


;***** Code

div16u: clr drem16uL ;clear remainder Low byte
sub drem16uH,drem16uH;clear remainder High byte and carry
ldi cnt,17 ;init loop counter
d16u_1: rol byte ;shift left dividend
rol byteH
dec cnt ;decrement counter
brne d16u_2 ;if done
ret ; return
d16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uH
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uH,dv16uH ;
brcc d16u_3 ;if result negative
add drem16uL,dv16uL ; restore remainder
adc drem16uH,dv16uH
clc ; clear carry to be shifted into result
rjmp d16u_1 ;else
d16u_3: sec ; set carry to be shifted into result
rjmp d16u_1
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016