我正在寻找一种快速的方法来执行以下划分:
- 股息是一个有符号的 64 位整数。
- 除数是带符号的 32 位整数。
- 商应该是有符号的 64 位整数,余数是不必要的。
- 股息的低位 dword 为零。
我只使用 32 位数据类型,因为编译器对 64 位数据类型的支持很差,而且没有汇编。准确性可能会因速度而有所妥协。
对此有任何指示吗?
i386 和可能的其他机器直接支持 64/32 除法,只要被除数的高位字小于除数(即除数在 32x32->64 乘以除数的范围内)。如果您的编译器对 64 位类型的支持最少,它可能能够识别这种情况并利用它。
假设你已经检查了生成的 asm 并发现它没有利用这一点,或者如果你知道你的 cpu 没有这样的除法指令,那么你只需要像你在小学学到的那样做长除法..除了它是 base-4294967296 而不是 base-10。
您可以尝试阅读源代码libgcc
,因为它包含用于没有本机支持的机器的 64/64 除法的代码。
编辑:实际上,由于您没有 64/32 除法运算,您可能需要使用 base-65536。这是因为幼稚的长除法需要在每一步将“2 位”数字除以“1 位”数字。当然,现在你被困在做更多的步骤..