2011-04-10 75 views
10

問題的問題的解決方案:請解釋一下下面

考慮添加兩個n位二進制整數,存儲在兩個正元件陣列A和B的兩個整數的總和應該是問題以二進制形式存儲在(n + 1) - 元素數組C中。正式說明問題並編寫用於添加兩個整數的僞代碼。

解決方案:

  1. Ç←[1 ... N + 1]▹C是零填充。
  2. 對於i←1到n
  3. 做總和←A [I] + B [1] + C [i]於
  4. C [I]←總和%2
  5. C [I + 1]←總和/ 2▹整數除法。
  6. C輸出

問題:

  1. 我認爲C [i]爲A [1] + B [i]於爲什麼要補充總和←A [I] + B [我] + C [i]在步驟3?
  2. 爲什麼總和%2(爲什麼需要在步驟4中使用的模?)
  3. 爲什麼總和/ 2(爲什麼需要使用部門在步驟5?)

請您上面有真正的解決辦法解釋例?謝謝。

+0

考慮如何添加_by hand_十進制數字,如「179 + 256」。您可以逐位工作,將任何大於基數的結果「攜帶」到左邊的「單元格」中...嘗試使用手動添加小數添加的幾個示例,然後嘗試二進制添加。 :) – sarnold 2011-04-10 05:57:15

回答

15

C既是解決方案又是進位。對於一個真實的例子,讓我們添加11 + 3,我會以二進制寫在括號小數點)

A = 1011 (11) + B = 0011 (3) [C starts as 00000 (0)] 
    ^   ^     ^

的^ S標誌的第一個位置,我們向左走,因爲我們讀到左到右,但數學從右到左。另外,我們分割整數,所以3/2 = 1,而不是1.5。現在的步驟。

1. sum = 1+1+0 = 10 (2), c[1] = 2 % 2 = 0, c[2] = 2/2 = 1 
2. sum = 1+1+1 = 11 (3), c[2] = 3 % 2 = 1, c[3] = 3/2 = 1 
3. sum = 0+0+1 = 01 (1), c[3] = 1 % 2 = 1, c[4] = 1/2 = 0 
4. sum = 1+0+0 = 01 (1), c[4] = 1 % 2 = 1, c[5] = 1/2 = 0 
^  ^^^       ^
i  A B C, all at position i   note that we store the carry for the NEXT step 

結果:C = 01110(14)

+1

感謝您的非常明確的答案! – Mayumi 2011-04-10 06:18:22

5
  1. 您添加C[i]以及因爲C[i]可能包含來自當你在前面的迭代添加A[i-1] + B[i-1] + C[i-1]進位。例如,如果我們做1 + 1,我們的第一次迭代sum = 1 + 1 + 0 = 2,但由於這是二進制的,我們必須攜帶1並將其放在C[1]上,並將其餘部分(2 % 2 = 0)放入C[0]。這給了我們10
  2. C[i]得到總和%2,因爲A[i] + B[i] + C[i]的總和可能大於1,但1是最適合那個數字的。其餘的數額(如果有的話)將被放入進位位。這使我們...
  3. C[i+1]得到分配sum/2,因爲sum/2是進項金額。當我們爲i = i + 1A[i] + B[i] + C[i]時,它將在下一次迭代中使用。
+0

感謝您提供非常直觀和明確的答案! – Mayumi 2011-04-10 06:19:10

4

您可以考慮添加二進制數字的方式與您添加10位數字的方式相同:每個數字都有一個「添加」步驟和一個「攜帶」步驟。

那麼,讓我們一次一個地拿數學。假設我們正在添加:

 
101 
+ 
011 

第一步,我們從最右邊開始。 (在你的例子中,這對應於i = 1)。我們添加(1 + 1)%2,這給了我們0.真正發生在這裏的是什麼? 1 + 1是2,二進制數是兩位數(「10」)。我們只能寫低位數字(「0」),所以表達總和「mod 2」實際上只是說「現在不用擔心結轉金額」。所以,我們有:

 
101 
+ 
011 
--- 
    0 (carrying a 1) 

現在我們貫徹 「攜帶1」 做整數除法( 「總和/ 2」),並暫時將其存儲:

 
101 
+ 
011 
--- 
10 

現在我們準備添加第二個數字:(0 + 1)%2 - 但我們必須在繼承1中添加我們一直在追蹤的內容,因此我們取(0 + 1 + 1)%2產生:

 
101 
+ 
011 
--- 
00 

同樣我們需要保持tr進位的ACK,給我們(0 + 1 + 1)= 1:

 
101 
+ 
011 
--- 
100 

最後,我們添加了第三位:(1 + 0 + 1)%2給出了答案:

 
101 
+ 
011 
--- 
1000