提问人:Loge 提问时间:8/18/2023 最后编辑:Loge 更新时间:8/19/2023 访问量:89
如何扩展我的代码除以 64 位整数?(128位/64位)[关闭]
How can I extend my code do divide by a 64bit integer? (128bit / 64bit) [closed]
问:
我的问题是我的代码只是将 128 位除以 32 位整数,而不是除以 64 位。 我知道有一些说明,例如 _umul128() 或 __uint128_t,但我需要一个便携式版本。
该代码仅在除数小于uint32_t时才有效,我不知道为什么。
uint64_t udiv32(uint64_t high, uint64_t low, uint32_t divisor, uint32_t* rem)
{
uint64_t q0, r0;
uint64_t q1, r1;
uint64_t temp;
const uint32_t a_lo = low & 0xFFFFFFFF;
const uint32_t a_hi = low >> 32;
r0 = high % divisor;
temp = ((r0 << 32) | a_hi);
q1 = temp / divisor;
r1 = temp % divisor;
temp = ((r1 << 32) | a_lo);
q0 = temp / divisor;
r0 = temp % divisor;
*rem = r0;
return ((q1 << 32) | q0);
}
也许有人可以帮助我扩展函数,以便除数可以是uint64_t。 也请不要讨厌我这个:)
答:
2赞
John Bollinger
8/19/2023
#1
所提出的函数似乎在以 232 为基数中实现了长除法算法,适用于具有最多四个(大)数字和一个(大)数字除数的除数的特定情况。它不会处理大于 232-1 的除数,即使您为参数提供更宽的类型。divisor
如何扩展我的代码除以 64 位整数?
您最好的选择可能是两个特定于 128 位/64 位大小写的单独版本。您可以在 base 264 中执行此操作,使其比 128 位/32 位版本更简单。没有很好的方法可以重用现有代码本身来实现此目的,尽管你可以从中寻找灵感。但是,这不是编码服务,因此我将详细信息留给您。
评论
divisor
uint32_t
uint32_t
uint64_t