2010-08-12 2 views
6

Ищу быстрый способ выполнить следующее: дивизия64 бит на 32 бит разделения

  • дивидендам является подписанная 64-битное целое.
  • Divisor - это 32-битное целое число.
  • Quotient должен быть подписанным 64-битным целым числом, остальное не нужно.
  • Низкий слон дивиденда равен нулю.

Я использую только 32-битные типы данных, поскольку 64-разрядные версии плохо поддерживаются компилятором и не имеют сборки. Точность может быть скомпрометирована в пользу скорости.

Любые указатели на этом?

+0

Если ваши младшие 32-биты равны 0, то в любом случае у вас не останется остатка. – ysap

+2

@ysap: Не верно. Рассмотрим '(1L << 32)/3'. –

+0

Мне любопытно, вы используете 32-битный процессор с разумным _up-to-date_ компилятором C, который не поддерживает 64-битные целые числа? Что это за разочарование? – mctylr

ответ

2

Разделение 64/32 поддерживается непосредственно i386 и, возможно, другими машинами, если высокое слово дивиденда меньше делителя (т. Е. Дивиденд находится в диапазоне 32x32-> 64, умножаясь на делитель). Если ваш компилятор имеет минимальную поддержку для 64-битных типов, он может распознать эту ситуацию и воспользоваться ею.

Предполагая, что вы уже проверили сгенерированный asm и обнаружили, что он не использует это, или если вы знаете, что ваш процессор не имеет такой инструкции разделения, вам просто нужно сделать длинное деление, как вы узнали в классная школа .. кроме этого это база-4294967296 вместо базы-10.

Вы можете попробовать прочитать исходный код до libgcc, так как он содержит код для разделения 64/64 для машин, у которых нет встроенной поддержки.

Редактировать: На самом деле, поскольку у вас нет операции разделения 64/32, вы можете использовать base-65536. Это связано с тем, что наивное длинное разделение требует деления «двузначного» числа на «1-значный» номер на каждом шаге. Конечно, теперь вы застряли, делая больше шагов.

+1

Кнут обсуждает длинное деление и описывает алгоритм длинного деления. Если вы пойдете по этому пути, у Кнута есть оптимизация, где вы можете покинуть цикл раньше. Это очень сложно проверить, оно помогает только в небольшом количестве случаев и может быть легко исключено. – janm

Смежные вопросы