首页 > 解决方案 > 如何在c语言中将64位除以64位而没有int64数据类型

问题描述

在 C 中,

除数和除数都是 64 位整数,由两个 32int, hi, lo 组成

商也是 64 位,由 hi 和 lo 组成。

我不能只使用 int32 的 float 和 long long 数据类型。

我通过比较除数和除数的更高位来尝试它,如果除数更大并向右移动,则减去。(像这张图 改进了 MIPS 中的二进制除法算法

但它太慢了.....我需要 64cycle

标签: c

解决方案


还记得你是如何学会做长除法的吗?

就像那样,但在每个“数字”中最多计数 64K

如果您只有 32 位操作可用,那么您需要 2 个“数字”来执行每个乘法或除法并获得一个值和一个余数,因此您将数字设为 16 位、64K。

[请注意,某些处理器没有可用的 64x64=>64bit 或 64/64=>64bit 操作,但有 32x32=>64 和 64/32=>32r32 操作,但很难强制 C编译器来生成这些指令。]

我会让你计算出细节......如果需要先用十进制用4位数的除数和除数来做。

您可以看到,与简单的 32 位除法相比,它变成了很多乘法和除法运算。

如果您只想要一个近似值,那么您可以将两个 64 位值向下移动,直到被除数小于 32 位。

稍微更准确的是将除数和被除数都转换为 32 位,并记住每个移位的位数,进行除法,然后重新应用移位。

您可以使用此近似结果来获得更好的结果。将原始除数乘以结果,并将其与原始除数进行比较。如果它太高,尝试只减去一次除数。如果它太低,请尝试只添加一次除数。如果得到更好的结果,请酌情减少或增加您的答案。


推荐阅读