Моя копия Кнута (Искусство компьютерного программирования) в работе, поэтому я не могу проверить ее до понедельника, но это будет мой первый источник. Есть целый раздел по арифметике.
edit: ваш пост о "делении 16/16 и делении 32/16, которые занимают 18 циклов". - в dsPIC есть операция условного вычитания при сборке. Попробуйте использовать это как свой вычислительный примитив.
Также обратите внимание, что если X = XH * 2 32 + XL и D = DH * 2 16 + DL, то если вы ищете
(Q, R) = X / D, где X = Q * D + R
, где Q = QH * 2 16 + QL, R = RH * 2 16 + RL, затем
XH * 2 32 + XL = DH * QH * 2 32 + (DL * QH + DH * QL) * 2 16 + (DL * QL) + RH * 2 16 + RL
Это предлагает (рассматривая термины, которые старшие 32 бита) использовать следующую процедуру, сродни длинному делению:
- (QH, R0) = XH / (DH + 1) -> XH = QH * (DH + 1) + R0 [32/16 деление]
- R1 = X - (QH * 2 16 ) * D [требуется умножение 16 * 32, сдвиг влево на 16 и 64-разрядное вычитание]
- Рассчитать R1 '= R1 - D * 2 16
- пока R1 '> = 0, отрегулировать QH вверх на 1, установить R1 = R1' и перейти к шагу 3
- (QL, R2) = (R1 >> 16) / (DH + 1) -> R1 = QL * (DH + 1) + R2 [32/16 деление]
- R3 = R1 - (QL * D) [требуется умножение 16 * 32 и вычитание 48 бит]
- Рассчитать R3 '= R3 - D
- пока R3 '> = 0, отрегулировать QL вверх на 1, установить R3 = R3' и перейти к шагу 7
Ваш 32-битный фактор - это пара (QH, QL), а 32-битный остаток - R3.
(Предполагается, что частное не больше 32-разрядного, что необходимо знать заранее, и его можно легко проверить заранее.)