2012-02-29 81 views
0

我正在做一些使用tesseral算術的工作,我需要檢測一個單詞的特定區域中的進位。由於程序的性質,位的位置取決於輸入。例如,對於一個32位的字長和一個6位的輸入,我有興趣檢查第19和3位的加法運算,第31和15位進行減法運算(更一般地,有趣的位是(字長 - 1),(字大小/ 2 +輸入位/ 2),(字大小/ 2-1)和(輸入位/ 2))。自定義溢出檢測

我在想什麼是沿着線的東西:

(after addition)   ((NumberToCheck & (1 << 19 + 1 << 3)) != 0) --> carried bit(s) 

    (or after subtraction) ((NumberToCheck & (1 << 31 + 1 << 15)) != 0) --> carried bit(s) 

有沒有更好的辦法呢?

回答

1

通過計算carry-ins = a XOR b XOR s,您可以從整數a,b及其總和s中找到所有插入。

當然,進位也是前一位位置的進位。

最顯著搬出(表示無符號溢出)可以用來確定,在C/C++說話,most-significant-carry-out = (a > 0xFF...FF - b),其中0xFF...FF是適當的最大值和ab都是非負的值。

減法可以簡化爲加法。請參閱我的回答this questionthis question

+0

我不確定這種方法會做我需要的;當我使用tesseral算術時,我首先解決了我正在處理的單詞中的一些問題。然後,我需要立即檢查兩個地點的運輸情況;一個用於x座標,另一個用於y。在上面的例子中,我有類似00000xxx00000xxxb(其中每個x是一些有意義的值,每個0都不是),所以分配最大數目只會幫助左子字。 – bendicott 2012-03-02 02:13:09

+0

如果有幫助,我也只對積極空間感興趣,所以a和b將始終是積極的價值。每個子詞只會增加或減少一個,這進一步簡化了事情 - 如果他們這樣做,我知道這些承載發生在哪裏。我主要對速度感興趣;有沒有更好的方法來檢查這些特定位的更改? (對於雙重發布,不適合一個評論) – bendicott 2012-03-02 02:13:29