c - 如何在c语言中将64位除以64位而没有int64数据类型
问题描述
在 C 中,
除数和除数都是 64 位整数,由两个 32int, hi, lo 组成
商也是 64 位,由 hi 和 lo 组成。
我不能只使用 int32 的 float 和 long long 数据类型。
我通过比较除数和除数的更高位来尝试它,如果除数更大并向右移动,则减去。(像这张图 改进了 MIPS 中的二进制除法算法 )
但它太慢了.....我需要 64cycle
解决方案
还记得你是如何学会做长除法的吗?
就像那样,但在每个“数字”中最多计数 64K
如果您只有 32 位操作可用,那么您需要 2 个“数字”来执行每个乘法或除法并获得一个值和一个余数,因此您将数字设为 16 位、64K。
[请注意,某些处理器没有可用的 64x64=>64bit 或 64/64=>64bit 操作,但有 32x32=>64 和 64/32=>32r32 操作,但很难强制 C编译器来生成这些指令。]
我会让你计算出细节......如果需要先用十进制用4位数的除数和除数来做。
您可以看到,与简单的 32 位除法相比,它变成了很多乘法和除法运算。
如果您只想要一个近似值,那么您可以将两个 64 位值向下移动,直到被除数小于 32 位。
稍微更准确的是将除数和被除数都转换为 32 位,并记住每个移位的位数,进行除法,然后重新应用移位。
您可以使用此近似结果来获得更好的结果。将原始除数乘以结果,并将其与原始除数进行比较。如果它太高,尝试只减去一次除数。如果它太低,请尝试只添加一次除数。如果得到更好的结果,请酌情减少或增加您的答案。
推荐阅读
- python - 如何用两个新维度替换 xarray 对象的当前维度
- python - “FileNotFoundError:[Errno 2] 没有这样的文件或目录:”尽管使用了完整路径
- elasticsearch - 如何对弹性搜索进行嵌套搜索?
- mingw - mingw/lib 与 msys/1.0/lib 之间的区别?
- php - 问:如何在 laravel 的控制器中制作条件构造函数语句
- r - mean(,na.rm = TRUE) 返回 NA 和警告消息
- python - Python 模块可以导入,但它不是来自屏幕窗口
- rust - 在执行异步数据库插入时,如何确保插入的查询数据的寿命足够长?
- arrays - 无法将 undefined 或 null 转换为对象:Next.js || 反应
- reactjs - 反应:useState 值不会在参数值更改时更新