我寻找执行以下divison的快捷方式:64位的32位除法
- 分红是有符号的64位整数。
- 除数是一个有符号的32位整数。
- 商应该是一个有符号的64位整数,其余是不必要的。
- 股息的低dword为零。
我只使用32位数据类型,因为编译器很少支持64位数据类型,也没有汇编。精度可能会受到一定程度的损害,有利于速度。
这一个的任何指针?
我寻找执行以下divison的快捷方式:64位的32位除法
我只使用32位数据类型,因为编译器很少支持64位数据类型,也没有汇编。精度可能会受到一定程度的损害,有利于速度。
这一个的任何指针?
64/32除法由i386和可能的其他机器直接支持,只要被除数的高位字小于除数(即除数在32x32-> 64范围内除以除数)。如果您的编译器对64位类型的支持最少,它可能会识别这种情况并利用它。
假设你已经检查了生成的asm并发现它没有利用这个优势,或者如果你知道你的cpu没有这样的分割指令,那么你只需要像你在小学......除了基数为4294967296而不是基数为10。
您可能会尝试读取源代码为libgcc
,因为它包含64/64分区的代码,用于没有本机支持的计算机。
编辑:其实,因为您没有64/32除法操作,您可能需要使用base-65536。这是因为天真的长分组需要在每个步骤中将“2位数”号码除以“1位数”号码。当然,现在你被困在做更多的步骤..
Knuth对长分区进行了讨论,并描述了长分区算法。如果你真的走上了这个道路,Knuth有一个优化,你可以尽早离开循环。这是很难测试的,它只有在少数情况下有帮助,可以安全地排除在外。 – janm 2010-08-13 07:39:20
如果你的低32位是0,那么你将不会有余数。 – ysap 2010-08-12 21:23:37
@ysap:不正确。考虑'(1L << 32)/ 3'。 – 2010-08-12 21:26:29
我很好奇,您是否正在使用32位处理器,以及合理的_up-to-date_ C编译器,它不支持64位整数?什么是令人沮丧的组合? – mctylr 2010-08-12 21:32:46