2013-05-29 79 views
0

我目前正在開發一個實用程序,用於處理位集上的所有算術運算。該bitset可以自動調整大小,以適應任何數字,所以它可以執行加/減/除法/乘法和模非常大的位集(我已經拿出一個700Mo電影裏面把它當作一個原始整數)C++按位加法,計算代表位的最終數量

雖然我面臨一個問題,但我需要我的補充來調整我的位集以適應添加後所需的確切位數,但我不能拿出絕對的法則來確切地知道有多少位將需要存儲的一切,只知道這兩個數字處理的位數(無論其表示正面或負面,沒關係)

我有我可以與你分享的整個代碼點如果我的問題不夠清楚,那就解決問題。

在此先感謝。 jav974

+0

兩種選擇:或者是2遍,首先通過計算最後一位是否執行進位來計算位數,然後分配結果,然後執行實際加法。其他選擇是爲結果分配'max(len(a),len(b))+ 1'位,這可能有點太過分了,但是誰在乎... – leemes

+0

它太多了, ,它打破了我後面提出的邏輯:/你的解決方案是完美的乘法,這是我實現它的方式 – jav974

回答

2

,但我不能想出一個絕對的法律確切地知道有多少位將需要存儲的一切,只知道這兩個數字處理的位數(無論其表現爲正或否則無所謂)

你也不會:「沒有辦法給出」只有兩個數字處理的位數「。

對於帶相同符號的數字,您可能需要一個額外的位 - 您可以從較小數字的最高位開始,掃描0來吸收進位的影響。例如:

1010111011101 + 
..10111010101 
..^ start here 

由於兩個號碼有1這裏需要向左掃描,直到你擊中一個0(在這種情況下,結果具有相同的位數爲較大的輸入),或直到到達大數的最重要的位(在這種情況下,結果中還有一位數字)。

1001111011101 + 
..10111010101 
..^ start here 

在這種情況下再輸入具有0的起始位置,你首先需要做一個正確的移動掃描,以確定是否存在會從起始位置的右側進前推出進入上面的左移動掃描。

當符號不同:

  • 如果一個值有2個或更多的數字小於另一個,則在結果所需數字的數量將是相同的或比在較大的位數少一個輸入
  • 否則,只需要計算結果需要多少位數就可以完成更多工作。

這是假定符號位與量值位數分開。

+0

是的符號位在數量級上是分開的。 – jav974

+0

:'(這很難說我在想什麼,我承擔不起更多的努力來調整集合,而不僅僅是執行一個非常輕量級的操作......不管怎麼說,如果你/別人有另一個想法或確信關於不能用單線程函數或類似的東西知道...... – jav974

+0

好吧,正如leemes所說的那樣,在添加相同簽名的值時,您知道1位內沒有檢查這些值,我明白您的現有代碼可能無法應對主要是「0」,但它可能是值得改變的,給定兩個有效的隨機數,掃描方法一般有50/50的機會可以解決你檢查的每一個額外位,這樣分攤的成本很低,但是很容易想象有人用這種方式會持續觸發近乎最差情況的表現 –

0

最後,加法後的代表位的數量最多是擁有最多+1的位的數量。

下面是一個說明,使用無符號字符:

對於最大無符號字符:

11111111 (255) 
+ 11111111 (255) 
= 111111110 (510) 

當然,如果最大+ MAX =(最大+ 1的比特),則對於在0 x和y並且最大結果位在最大+ 1(非常大)

這與帶符號整數的工作方式相同。