2013-12-21 44 views
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的幂数? (保留一个进位存储号码)

+0

你能解释你的线条的含义吗? c001 7fff = 4000是什么意思? –

+0

增加了一点。在所有操作中,您添加虚拟进位和虚拟保存以获取普通二进制数 – StanOverflow

回答

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”结束。

+0

我看到,我需要检查在右侧没有丢失进位,并且不添加可能丢弃的数字在左手侧。 – StanOverflow

+0

非常感谢,非常感谢 – StanOverflow

0

有一种技术来纠正表示,使其可移位。这源于Tobias Noll撰写的论文“用于高速数字信号处理的进位存储体系结构”。就可以计算进位和总和向量的新的登录比特作为

C” = c_out

S'= S XOR C XOR c_out

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