0

进位保存算法使用两倍的位数,一个字保存“虚拟和”,一个字保存“虚拟进位”以避免传播进位,这是硬件速度的限制因素。

我有一个系统需要将这些数字除以 2 的幂,但简单地右移两个数字并不适用于所有情况,例如。两个 16 位进位保存数,相加产生 4000,C001 是虚拟和,7FFF 是虚拟进位。

C001 + 7FFF = 4000  (discard overflow bits)
but after right shift
6000 + 3FFF = 9FFF   (when it should be 2000)

简而言之:您如何将进位保存数除以 2 的幂?(同时保留一个进位保存号码)

4

2 回答 2

1

首先,右移 1 有效地删除了 2 并忘记了余数。但是为了得到准确的结果,可能需要剩下的部分。例如,更改您的初始示例,将 C000 添加到 8000,或将 C002 添加到 7FFE。两者都给出相同的总和,但是移位值的总和是 A000 而不是您的 9FFF,这肯定更正确。因此,只有当 LSB 的总和可能丢失时,您才能进行此类移位。在您的情况下,有 2 个加数和 1 个位移位,这意味着不超过 1 个加数在其 LSB 中可以有 1。

其次,考虑这是固定的,你有 A000。一个简单的理想数学表示 (a+b)/2 == a/2 + b/2。对于您的情况,您最初忽略的进位位的重量为 0x10000,但在移位 1 后,它的重量为 0x8000。这正是 A000 与您预期的 2000 的不同之处。因此,如果您确定方法的其他方面,请使用 ~0x8000 == 0x7FFF 的逻辑 AND 完成它。

于 2013-12-21T16:01:39.253 回答
0

有一种技术可以纠正表示,使其可移动。这源于 Tobias Noll 的论文“用于高速数字信号处理的进位保存架构”。您可以将进位和求和向量的新符号位计算为

c' = c_out

s' = s xor c xor c_out

其中 s 和 c 是原始符号位,c_out 是进位保存加法中丢弃的进位位。

于 2014-09-02T20:05:58.190 回答