2009-10-19 95 views
2

我正在閱讀Charles Petzold的書「代碼」。他在文中解釋瞭如何使用以下模板的十進制數轉換成二進制轉換:將十進制數轉換爲二進制

   [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 
       ÷128 ÷64 ÷32 ÷16 ÷8 ÷4 ÷2 ÷1 
       [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 

在這本書中,他對如何使用該模板的解釋如下:

「把整個十進制數(小於或等於255)在 左上角的方框中,將第一個除數(128)除以該數字(被除數),如 所示。將商放在下方的方框中(左下方的方框(右上角的第二個框),第一個餘數是下一次計算的分紅,其中使用64的除數。繼續以相同的方式通過模板。

請記住,每個商都可以是0或1.如果紅利小於除數,則商數爲0,餘數僅爲股息。如果股息大於或等於除數,則商數爲1,餘數爲除數 - 除數。下面是它是如何用150做!」

   [150] [22] [22] [22] [6 ] [6 ] [2 ] [0 ] 
       ÷128 ÷64 ÷32 ÷16 ÷8  ÷4  ÷2  ÷1 
       [1 ] [0 ] [0 ] [1 ] [0 ] [1 ] [1 ] [0 ] 

但我很困惑。當我這樣做的指示的計算,我得到不同的結果我在做什麼如下:

150÷128 = 1.171875(我沒有看到22從哪裏來的?)因此,我在150下面的框中放置1,然後攜帶並將其用作下一個的分紅計算,這當然會讓我陷入各種各樣的問題,最終,不是二進制數10010110!

有人能告訴我我要去哪裏嗎?

+2

這是整數除法:'a = qd + r':'0 <= r 2009-10-19 21:28:33

回答

7

22是的一百二十八分之一百五十零剩餘部分。因爲你已經確定150中有1 128個「,並給出了該位的值,所以你可以忘記128中的」in「150,所以你把它從150中拿走,離開我們的22。那麼是時候值64:64的數字不會進入22,所以這個數字是0.而對於數字爲32的數字也是如此。然後,對於16:16的數字進入22一次,所以有一個數字在那裏,現在你已經完成了16「in」22,所以拿走它 - 離開6.等等。 (考慮類似的基數10的情況,比方說309.以100秒爲單位;在309秒中有3 100秒,所以你在那裏放了一個3,現在剩下9個,然後取10秒一列;在9中0 10s,所以你在那裏放一個0,然後1s列:9中有9個1,所以你把9放在那裏,現在沒有什麼了 - 你完成了。我有一種可怕的感覺,這可能比澄清更令人困惑,但這就是我無論如何想到的。

+0

太棒了 - 謝謝!完全是我以後的! – cw84 2009-10-19 21:49:08

5

22是餘數。
150/128 = 1餘數22

+0

哈哈。我本人不能說得更好。 – nall 2009-10-19 21:28:32

4

您需要做integer部門。

// Floating point 
150 ÷ 128 = 1.171875 

// Integer 
150 ÷ 128 = 1 remainder 22 

所以,你寫下來1並攜帶22下一個步驟。

0

該示例使用整數運算,並且150 - 128 => 22

該示例是故意代數的,但大多數現代語言都定義了按位二進制運算符。 (如果我們構建非二進制計算機,那麼這些將會被仿效。)因此,以這種方式實際執行二進制轉換是非常罕見的。更典型的情況下,您可以使用<<,>>&直接檢測各個位。

2

128一次進入150,剩餘22次。二進制數10010110轉換爲小數;

150 = (1 * 128) + (1 * 16) + (1 * 4) * (1 + 2) = 128+16+4+2 

以同樣的方式,我們可以分解小數150;

150 = (1 * 100) + (5 * 10) + (0 * 1) = 100 + 50