2013-12-21 45 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是進位保存添加中的丟棄進位。