Вы не указали платформу, которая имеет решающее значение для ответа.
X/Y всегда будет представим, используя тот же тип, что и Y, то есть операция можно предположить, чтобы не переполнить. (Поскольку Х представляет собой кстати произведение двух значений одного и того же типа, как Y, один из которых меньше или равна Y.)
На архитектуре x86-64, можно воспользоваться этим фактом , делением пары RDX:RAX
, так что на самом деле это то же самое, что и у вас будет один «склеенный» 128-разрядный регистр для дивиденда. Остерегайтесь, однако, что если выше инвариант не всегда выполняется, то вы получите исключение разделения от CPU.
Тем не менее, одна реализация использовать ассемблерные, например:
/* divides x1:x0 pair by y, assumes that quotient <= UINT64_MAX */
uint64_t udiv128_64_unsafe(uint64_t x0, uint64_t x1, uint64_t y)
{
__asm__ (
"divq\t%3"
: "=a" (x0)
: "0" (x0), "d" (x1), "rm" (y)
);
return x0;
}
который GCC 6.3.0 переводит красиво (в -O1
):
udiv128_64_unsafe:
mov rcx, rdx ; place the y (divisor) in RCX
mov rax, rdi ; low part of the dividend (x0)
mov rdx, rsi ; high part of the divided (x1)
divq rcx ; RAX = RDX:RAX/RCX
ret ; RAX is return value
Например, для X = 65454567423355465643444545
, Y = 86439334393432232
:
#include <stdio.h>
#include <inttypes.h>
uint64_t udiv128_64_unsafe(uint64_t x0, uint64_t x1, uint64_t y) { ... }
int main(void)
{
printf("%" PRIu64 "\n", udiv128_64_unsafe(0x35c0ecb3fea1c941ULL, 0x36248bULL,
86439334393432232ULL));
return 0;
}
данный испытательный драйвер программных выходов:
757231275
просто мысль. Вы можете запустить с ним: 'c = hi_x/y * 2^64 + lo_x/y;' Но вам нужно подумать, что 'hi_x/y' и' lo_x/y' не отдыхают. Не могу сейчас думать. Слишком поздно. – bolov
Я дал ссылку на аналогичный вопрос с решением (как дубликат) в вашей другой теме – MBo
«эффективный способ» эффективен в скорости? эффективный код? Какая платформа? на платформе есть эффективный 'unsigned' divide, эффективный' unsigned' multiply. Является ли 'unsigned long' дважды' unsigned' width? Опубликуйте то, что вы пробовали, даже если это просто 'x/y' и как это сравнивается с« эффективностью »с альтернативным кодом. – chux