2010-08-12 348 views
6

我寻找执行以下divison的快捷方式:64位的32位除法

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

我只使用32位数据类型,因为编译器很少支持64位数据类型,也没有汇编。精度可能会受到一定程度的损害,有利于速度。

这一个的任何指针?

+0

如果你的低32位是0,那么你将不会有余数。 – ysap 2010-08-12 21:23:37

+2

@ysap:不正确。考虑'(1L << 32)/ 3'。 – 2010-08-12 21:26:29

+0

我很好奇,您是否正在使用32位处理器,以及合理的_up-to-date_ C编译器,它不支持64位整数?什么是令人沮丧的组合? – mctylr 2010-08-12 21:32:46

回答

2

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

假设你已经检查了生成的asm并发现它没有利用这个优势,或者如果你知道你的cpu没有这样的分割指令,那么你只需要像你在小学......除了基数为4294967296而不是基数为10。

您可能会尝试读取源代码为libgcc,因为它包含64/64分区的代码,用于没有本机支持的计算机。

编辑:其实,因为您没有64/32除法操作,您可能需要使用base-65536。这是因为天真的长分组需要在每个步骤中将“2位数”号码除以“1位数”号码。当然,现在你被困在做更多的步骤..

+1

Knuth对长分区进行了讨论,并描述了长分区算法。如果你真的走上了这个道路,Knuth有一个优化,你可以尽早离开循环。这是很难测试的,它只有在少数情况下有帮助,可以安全地排除在外。 – janm 2010-08-13 07:39:20