进位保存算法使用两倍的位数,一个用于保存“虚拟和”,一个用于保持“虚拟进位”以避免传播进位,这是硬件速度的限制因素。
我有一个系统需要将这些数字除以2的幂,但简单地右移两个数字并不适用于所有情况,例如。两个16位进位保存号,你加上产生4000,C001是虚拟总和,7FFF是虚拟进位。
C001 + 7FFF = 4000 (discard overflow bits)
but after right shift
6000 + 3FFF = 9FFF (when it should be 2000)
简而言之:如何将进位保存数除以2的幂? (同时保留一个进位保存号码)
答案 0 :(得分: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的不同之处。所以,如果你确定你的方法的其他方面,用逻辑AND完成它与~0x8000 == 0x7FFF。
答案 1 :(得分:0)
有一种技术可以纠正表示,使其可以移动。这源于纸张" Carry-save架构,用于高速数字信号处理"作者:Tobias Noll。您可以计算进位和和向量的新符号位
C' = c_out
S' = s xor c xor c_out
其中s和c是原始符号位,c_out是进位保存加法中丢弃的进位位。