计算乘法后溢出位的有效方法
efficient way to compute the overflow bits after multiplication
这是一个关于算法的概念性问题,与我个人正在解决的问题有关。
在实际CPU架构中,将乘法后的溢出位存储在某个寄存器中是很常见的,但是如果没有这个功能怎么办?有没有一种计算溢出位的有效方法?
因为它是 溢出 a * b >> bits
不是一个选项。
我可以想象出两个基本选项。
旧的 CPUs 根本不支持乘法。我们不得不手动完成。您始终可以通过加法和移位来实现乘法。该算法非常简单,并且不限于任何位数(因为在所有 CPU 上的任何位数中加法和移位都很容易完成)。
如果您的 CPU 可以在 N 位中进行乘法而不会溢出,您可以使用它作为帮助,比上面提到的逐位计算更快地获得结果。如果 a 和 b 都是 N 位宽,那么 a * b 的结果就是 2N 位宽。如果将 a 和 b 分成两半,那么每一半都是 N/2 宽,它们的乘积是 N 位宽。因此,您将两半彼此相乘,然后将它们相加。如果我们标记上半部a2/b2和下半部a1/b1,则下部结果为a1 * b1,中部结果为a2 * b1 + a1 * b2,上部结果为a2 * b2,每次加溢出。我希望它足够简单,所以不需要详细描述。
这是一个关于算法的概念性问题,与我个人正在解决的问题有关。
在实际CPU架构中,将乘法后的溢出位存储在某个寄存器中是很常见的,但是如果没有这个功能怎么办?有没有一种计算溢出位的有效方法?
因为它是 溢出 a * b >> bits
不是一个选项。
我可以想象出两个基本选项。
旧的 CPUs 根本不支持乘法。我们不得不手动完成。您始终可以通过加法和移位来实现乘法。该算法非常简单,并且不限于任何位数(因为在所有 CPU 上的任何位数中加法和移位都很容易完成)。
如果您的 CPU 可以在 N 位中进行乘法而不会溢出,您可以使用它作为帮助,比上面提到的逐位计算更快地获得结果。如果 a 和 b 都是 N 位宽,那么 a * b 的结果就是 2N 位宽。如果将 a 和 b 分成两半,那么每一半都是 N/2 宽,它们的乘积是 N 位宽。因此,您将两半彼此相乘,然后将它们相加。如果我们标记上半部a2/b2和下半部a1/b1,则下部结果为a1 * b1,中部结果为a2 * b1 + a1 * b2,上部结果为a2 * b2,每次加溢出。我希望它足够简单,所以不需要详细描述。