как я могу разделить 64-битные на 64-битные без типа данных int64 на языке c - PullRequest
0 голосов
/ 20 сентября 2019

В C,

делитель и деление являются 64-битными целыми числами, которые состоят из двух 32int, hi, lo

, а частное также является 64-битным, состоящим из hi и lo.

Я не могу использовать тип данных с плавающей и длинной длинной только int32.

Я пробовал сравнивать делитель и старший бит деления и вычитать, если делитель больше и сдвигается вправо.(как на этой картинке Улучшен алгоритм двоичного деления в MIPS )

, но он слишком медленный ..... мне нужно 64cycle

1 Ответ

0 голосов
/ 20 сентября 2019

Помните, как вы научились делать длинное деление в школе?

Точно так же, но считайте до 64 КБ в каждой "цифре"

Если у вас есть только 32-битные операции, то вам нужно 2 "цифры", чтобы выполнить каждое умножение или деление и получитьзначение и остаток, так что вы делаете ваши цифры 16-битными, 64K.

[Обратите внимание, что некоторые процессоры не имеют 64x64 => 64-битную или 64/64 => 64-битную операцию, но имеют32x32 => 64 и 64/32 => 32r32, но будет сложно заставить компилятор C сгенерировать эти инструкции.]

Я позволю вам разобраться в деталях ...При необходимости сначала выполните десятичное разделение с использованием 4-значного деления и делителя.

Вы можете видеть, что это превращается во множество операций умножения и деления по сравнению с простым 32-разрядным делением.

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

Чуть более точным является смещение делителя и дивиденда в 32-битное значение,и запомните количество сдвинутых битдля каждого делите деление, затем повторно применяйте смены.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...