如何扩展我的代码除以 64 位整数?(128位/64位)[关闭]

How can I extend my code do divide by a 64bit integer? (128bit / 64bit) [closed]

提问人:Loge 提问时间:8/18/2023 最后编辑:Loge 更新时间:8/19/2023 访问量:89

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

3个月前关闭。

我的问题是我的代码只是将 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。 也请不要讨厌我这个:)

C++ C 部门

评论

3赞 Pepijn Kramer 8/18/2023
你要求C++还是“C”?您需要选择一种,因为它们是不同的语言,可能具有不同的解决方案(或至少是首选的解决方案)。请问为什么除数是uint32_t而不是uint64_t?
0赞 John Bollinger 8/18/2023
您提供的特定代码声明为 .当然,当除数参数太宽而无法表示为 .divisoruint32_tuint32_t
0赞 John Bollinger 8/18/2023
但话虽如此,是的,看起来该功能特定于 128 位/32 位情况。
1赞 8/19/2023
标记 c:C 与 C++ 不同,如果没有特定原因,不应将其与 C++ 标记结合使用。
1赞 Marek R 8/19/2023
为什么所有参数都不使用相同的整数类型?如果溢出怎么办?uint64_t

答:

2赞 John Bollinger 8/19/2023 #1

所提出的函数似乎在以 232 为基数中实现了长除法算法,适用于具有最多四个(大)数字和一个(大)数字除数的除数的特定情况。它不会处理大于 232-1 的除数,即使您为参数提供更宽的类型。divisor

如何扩展我的代码除以 64 位整数?

您最好的选择可能是两个特定于 128 位/64 位大小写的单独版本。您可以在 base 264 中执行此操作,使其比 128 位/32 位版本更简单。没有很好的方法可以重用现有代码本身来实现此目的,尽管你可以从中寻找灵感。但是,这不是编码服务,因此我将详细信息留给您。