将64位加法分成两个32位加法

时间:2011-09-20 09:22:47

标签: performance algorithm 64-bit

我正在从事超高性能密集型计算任务。对于添加成对的两个32位整数数组,可以在64位体系结构上将两个32位值视为单个64位值,将它们添加到另一个阵列上的补码中,然后再将它们拆分与按位&运营商。显然如果有溢出,它们将不一样,但假设没有,是否会出现问题? (你可以继续增加16位和8位吗?)

对于unsigned vs signed?

,行为是否会发生变化?

3 个答案:

答案 0 :(得分:2)

有符号和无符号之间没有区别 - 在两个补码机器上,它只是一条不知道符号的指令。是的,你可以安全地做这个技巧如果没有溢出风险你可以为任何长度的子部分做这个,例如,你可以认为你的64位数字包含两个13位数字和一个38位数字。

答案 1 :(得分:2)

如果假设没有溢出,则可以将其设置为单个位。当然,1 + 1溢出。 但是在实践中,你要么有溢出,要么你真的有31位整数开始。

另一件事:它只适用于unsigned类型。您不能在64位数字的中间有一个符号位。

但你为什么关心?如果您要进行超级性能密集型操作,请使用SSE。它会正确地进行并行添加。

答案 2 :(得分:0)

是的,你可以这样做,但它只适用于无符号值。对于带符号的32位整数,符号位是高位,在添加时会导致溢出。

您可能不需要这样做 - 如果您的本机C编译器没有提供您需要的性能,那么请查看使用矢量操作(MMX,SSE等)来非常有效地执行此类矢量操作。