6

我正在寻找一种快速的方法来执行以下划分:

  • 股息是一个有符号的 64 位整数。
  • 除数是带符号的 32 位整数。
  • 商应该是有符号的 64 位整数,余数是不必要的。
  • 股息的低位 dword 为零。

我只使用 32 位数据类型,因为编译器对 64 位数据类型的支持很差,而且没有汇编。准确性可能会因速度而有所妥协。

对此有任何指示吗?

4

1 回答 1

2

i386 和可能的其他机器直接支持 64/32 除法,只要被除数的高位字小于除数(即除数在 32x32->64 乘以除数的范围内)。如果您的编译器对 64 位类型的支持最少,它可能能够识别这种情况并利用它。

假设你已经检查了生成的 asm 并发现它没有利用这一点,或者如果你知道你的 cpu 没有这样的除法指令,那么你只需要像你在小学学到的那样做长除法..除了它是 base-4294967296 而不是 base-10。

您可以尝试阅读源代码libgcc,因为它包含用于没有本机支持的机器的 64/64 除法的代码。

编辑:实际上,由于您没有 64/32 除法运算,您可能需要使用 base-65536。这是因为幼稚的长除法需要在每一步将“2 位”数字除以“1 位”数字。当然,现在你被困在做更多的步骤..

于 2010-08-13T06:58:04.527 回答