如果計算機也可以用十進位甚至一百進位有沒有可能提高性能?二進位中,有小燈泡開和關,如果用不同的亮度不就可以變成十進位了嗎?


是的,你的思考很好,計算機本身的理論模型,和採用哪個數學上的進位完全無關,十進位也好,五進位也好,二進位也好,進位在數學上都是等價的,並沒有哪個進位擁有其他進位無法實現的計算。

但計算機的實現是個工程問題,需要和真實的物理環境打交道,我們現在是用電路去實現我們的計算機模型,那就需要和物理電路打交道,需要考慮到信號的衰減延遲,電路器件的各種電氣特性,什麼電磁波干擾電流擾動,也就是會有失真的情況出現,而要最大程度避免衰減,失真對計算機這個完美世界造成破壞,同時要考慮電路的設計,製作成本,就需要最簡單化的物理實現方案。

電子計算機確實是可以做成十進位的,就像題主說的像燈泡亮度分成十種亮度那樣,但與此同時會出現很多的工程問題,比如對電子器件的精度和穩定性要求很高,電路設計的複雜性提升等等,到頭來還不如就用二進位,在成本和質量上最划算。

現實是很殘酷的,就算採用了二進位這種最簡單最不容易出錯的方案,計算機運行都還有很多出錯的時候,我們的內存條也要ECC之類的糾正機制,這還是在地球大氣層保護之下,上了太空就更惡劣了。


我們先退一步思考這一個問題:當我們在說「計算機使用二進位」的時候,我們到底在說什麼?或者,「(現有的主流)計算機」和「二進位」之間到底是什麼關係?

首先還是要澄清一個概念:「二進位」這個詞嚴格來說只能用來描述記數法,而計算機中存儲的未必是要按照「數」解讀的東西;正確來說,應該問「『(現有的主流)計算機』和『二值表示(用兩個不同的數值的組合表示信息)』之間到底是什麼關係」。不過「二進位」和「二值表示」在英文都是「binary」,翻譯過來的時候就已經頗為混淆了,所以下文中我也會繼續採用「二進位」這個不嚴格的說法。

誠然,計算機表示數據的時候是用一堆「有兩個狀態的東西」表示的,每個「東西」可以對應一位二進位數。然而CPU在對寄存器中的數據進行操作的時候,從來都不是一次只對一位二進位數進行操作的,而是一次操作32個或者64個數位——這就是所謂「32位CPU」「64位CPU」的含義。考慮到人類使用十進位算數的時候總是一位一位地計算,從這個層面上完全可以說這32個到64個二進位位才是對計算機來說的「一位」;而計算機的「一位」越「長」,一般來說可以同時處理的信息也會越多,雖然64位CPU比起32位CPU達不到提速一倍的效果但終究是有提升的。(題外話,計算機的這種「一位」的這個「長度」一般叫做「字長」而不是「位長」——不過這名字也不錯,畢竟人類的計算可以說是一位一位地算,也可以說是一個「數字」一個「數字」地算。)

因此,對於題主的第一個問題——

如果計算機也可以用十進位甚至一百進位有沒有可能提高性能?

——我的回答是:當然有可能,而且其實已經在這麼做了,而且用的不是什麼「十進位」「一百進位」這樣寒磣的東西,而是4294967296進位,甚至18446744073709551616進位。只不過用的方式和題主在第二個問題里想像的不一樣,不是用「同一個量的更多不同等級」表示,而是用「同一種等級分布的更多個量」表示。因此,我可以猜到題主和一部分答主會對此有意見:說是更多進位,其實到了最最底下不還是二進位么?為什麼不做成從最最底下就是更多進位的呢?

這樣的話我就要反問一句:二進位真的是最最底下嗎?真正存在於「最最底下」的其實是電路中電壓的高低,是電容上電荷的多少,是磁碟上的磁化程度,光碟上的蝕刻程度,光纖中發光二極體或者「小燈泡」的亮度——而這些全都是(幾乎)連續的物理量,並沒有什麼天然的「只能取兩個值」的屬性。

關鍵並不在於信息的存儲,而更多地在於對信息的運算操作。從一個有些簡化的角度來看,電子計算機其實就是一系列複雜的小開關;計算機進行運算時,這些小開關一邊到存儲器中存取一些「狀態」,一邊以複雜的方式互相關聯,幾個小開關的開閉控制其他小開關的開閉,這些小開關或許又會反過來影響原來的小開關的開閉,以及通往存儲器的小開關的開閉。

所謂開關,其實就是大小可以大幅調節的電阻。普通的電器開關靠「撥動開關」的動作,在「金屬的低電阻」和「空氣的高電阻」之間進行調節;而計算機中的這些「開關」(場效應晶體管)則是根據「輸入端(柵極)的電壓」,在「自由電荷充足的低電阻」和「自由電荷缺失的高電阻」之間調節。不過,與電器開關不同,在輸入電壓連續變化時,場效應晶體管的電阻是連續可調的;也就是說,到這一步為止還沒有什麼「非用二進位不可」的必要性。

但是我們再具體考慮一下。比如,考慮一個最簡單的電路,在電源正極 [公式] 和負極 [公式] 之間有兩個大小可調的電阻,大小分別為 [公式] (正極側)和 [公式] (負極側);兩個電阻相接處的電壓是我們的輸出 [公式] 。那麼:

  • 怎麼讓這個電路輸出接近 [公式] 的電壓呢?很簡單,把 [公式] 選得很小、 [公式] 選得很大,相當於正極側開關閉合、負極側開關斷開。這是一種輸出。
  • 怎麼讓這個電路輸出接近 [公式] 的電壓呢?也很簡單,反過來把 [公式] 選得很大、 [公式] 選得很小,相當於正極側開關斷開、負極側開關閉合。現在有兩種輸出了。
  • 怎麼讓這個電路輸出比如說 [公式] 的電壓呢?當然,要選擇 [公式] 才行。但是這裡有一對矛盾——如果讓 [公式] 很小,相當於正負極之間接了一個很小的電阻,根據固定電壓下的焦耳熱公式 [公式] ,電路很快就會變得很燙,白白消耗了大量電能;如果讓 [公式] 很大,那麼發熱的問題是解決了,但是這個大電阻輸出又會很容易被下一級輸入端可能不那麼大的電阻「短路」掉,從而導致輸出電壓不穩定,而且還很容易在輸出電壓高低切換時,由於積累在輸出端的電荷無法及時通過大電阻轉移掉,而導致處理速度變慢。
  • 其他介於 [公式][公式] 之間的輸出電壓選擇也都有類似的問題,只有兩個電阻一小一大數值懸殊的兩種輸出才能既保證總電阻不太小,以免發熱,又保證輸出端有足夠小的電阻接往電源,以免被「短路」或阻礙快速運算。

因此,對於題主的第二個問題——

二進位中,有小燈泡開和關,如果用不同的亮度不就可以變成十進位了嗎?

——我的回答是:電子計算機的結構不適合處理過多的「等級」,不管是亮度等級還是電壓等級:計算機的「可變電阻開關」結構——以及計算機電源只有正負兩極的現象——決定了計算機必須在很底下的層面就選擇二進位,否則就必須在「大量發熱」和「不穩定且無法提速」之間二選一。(至於往上一些的層面,前面已經說了可以選擇4294967296進位之類了。)

那麼,能不能用並非只有正負兩極的電源呢?可以自然是可以——實際上前蘇聯也確實搞過從電源提供三種電壓的三進位計算機,名為Сетунь。但是電源線可不比其他的線路,必須要接到計算機中每一個「可變電阻開關」上,而且還不能有太大的內阻;因此,增加一條電源線可能讓布線麻煩很多,集成程度越高就更越是如此。(當然,Сетунь的失敗也有電源劣勢以外的各種因素沒錯。)

那麼,能不能不用「可變電阻開關」結構作為計算機的基礎呢?可以自然是可以——實際上也的確有使用其他的電路結構直接計算、再通過電壓表讀取計算結果的計算機,稱為模擬計算機。設計精良的模擬計算機不僅可以算出輸入電壓之間的四則運算結果,甚至可以直接計算輸入電壓在時間上的積分。但模擬計算機比起使用「開關」的計算機(數字計算機)又有一個劣勢,就是難以抗干擾——比如「開關」計算機中某一處收到了一個 [公式] 的信號,那我們既然已知這個信號本來只可能是 [公式] 或者 [公式] ,就有很大的把握可以說這個信號本來是 [公式] ,只是受到了 [公式] 的干擾;而模擬計算機中同樣的信號就只好解釋為「大概或許的確是 [公式] ,但其實可能是受到了干擾的 [公式][公式] 的任何一個電壓吧」了。此外,模擬計算電路對計算元件(電阻、電容、電感)的精確度也有比數字計算電路更高的要求,而且電容和電感又難以集成化、小型化;模擬計算機的種種劣勢決定了數字計算機現在的應用範圍已經遠遠超過了模擬計算機。

綜合各種方面的考慮,計算機在很底下的層面選擇二進位還是最好使的。

——不過模擬信號也確實並未完全銷聲匿跡。例如通訊中為了增大帶寬,會在同一時刻同時傳遞多個二進位位的信息;此時不僅可能有多於兩種種信號幅度的區別,甚至連信號相位的區別都可能成為攜帶數據的方式。不過這基本只出現於數據的存儲與傳遞過程中,接下來處理數據(「計算機」嘛,終歸要「計算」)還是要回歸二進位的。


在 @疑似精神病的基礎上增加幾句:

從硬體角度看:計算機的信號限制在0-2伏低電壓(用0表示)和2-5伏高電壓(用1表示)的範圍,這些電信號基本運算設備稱為門,門有6種基本類型,每種類型執行特定的邏輯函數;更多的門的組合稱為電路組合門(電路)來執行更加複雜的任務如算術運算和存儲值, 對門和電路的描述的有:

  1. 布爾表達式(變數和函數的值只有0或1),用於表達電路的活動,一開一關
  2. 邏輯框圖,電路的圖形化表示,每種類型的門有自己專用的符號
  3. 真值表, 所有可能的輸入,輸出值的表

從這些表示法配合0,1模式才能更好的進行計算。

參考《計算機科學概論》第三部分硬體層(門和電路)再補充兩句:
  • 計算機的運算都是二進位
  • 計算機為什麼出現這麼多進位的原因數據用二進位表示太長
  • C/C++代碼中不能直接寫二進位, 而是普遍採用八進位或十六進位
  • 為什麼不是9進位或20進位,原因就是2,8,16分別是2的次方,這就是三種進位之間可以直接互相轉換


因為計算機的物理構成是數字電路, 數字電路的基本構成是邏輯門電路,邏輯門電路的理論基礎是布爾邏輯運算,而布爾運算的結果只有兩種,二進位每一位正好能表示兩種布爾運算的結果。大概就是這樣的。如果要用別的那就得從基礎進行重新設計,要有一整套理論基礎。

因為底層三極體工作在數電狀態,只有高電平和低電平兩種狀態,所以用二進位。

如果要底層做十進位就要讓三極體工作在模電狀態,然後電平從低到高劃10個檔。模電計算機確實是有人做的,但不是為了控制電燈亮度這種需求,你可以去搜索一下…


推薦閱讀:
相关文章