淺談二進數學應用
人類有10隻手指,所以很自然地發展出用10個數字來數數目,即是我們自小就深深印在腦內的數目字 1 - 10。就我有限的歷史知識知道,我們歸功阿拉伯人給我們 0 的概念。所謂十進制 (即逢十進一),就是用 0 - 9 來表示自然數字 (即正數及整數)的個位數的計數系統。
不過即使在日常生活中,也有很多不是使用十進制計數的例子。最經常接觸的,應該就是時間了。將一天分為24小時,再每小時分為60分鐘,每分鐘又分為60秒。這些都不是逢十進一的情況。到了毫微秒的世界,又變為使用十進制了。一粆分為1000毫秒,一毫秒又有1000微秒。
我一直不明白中國人為什麼一斤會有十六両。這樣換算金錢時, 由十六進化十進(除非當年流通的貨幣也是十六進的) 很不方便。最近我才想到一斤十六両的好處。試想當有人要買你一半的貨,你從十六両中分八両給他。然後他賣一半給其他人,共四両。然後再分為二両,最後才是一両,即一個單位的貨物。從二到十六,所有數字都是雙數。這樣,貨物可以很合理地公平攤分。如果用十進制攤分的話,很快就出現2.5這數字。對於某些貨物,0.5可以是不切實際的攤分 (例如活牲口買𧷗,半隻牲口還能活嗎?)。
其實將事物一分為十,不是怎麼自然的數學。假設某某外星人有17隻手指,這樣他們會很自然地會用17進制表示數字。他們的 10 (不是十,請喚作「一,零」) 會有 17 件東西;20 是 34;100 是 289。對人類來說十分不自然,不是嗎?
斤両算法其實是十六進制的一個生活例子,或者說是二進制的一個實際應用。這系統方便攤分貨物,將物件較容易地一分為二,或雙倍累進。這也是二進制的根本好處。非黑即白,童叟無欺,沒有灰色地帶。
用STEM角度解說。我們說 Arduino 的接腳為 HIGH 或 LOW, 是將接腳的電壓值相對 Vcc (+5V或其他) 和接地 (0V) 間做個比較。比方說我們量到 +1V,我們會叫它做LOW。如果用十進制的話,我們可能會說它是2,因為 Vcc 是5V。或者是1,因為我們外接了9V電源供電。如果量度的結果是1.3,你說是多少?在二進的世界,這時仍是 0,或者 LOW。直至電壓到達某一點,就馬上變成 1,或者 HIGH。這樣,我們減少了很多中間模糊混淯的情況。由於只需分辨 0 和 1,電子線路設計比較直接簡明,將不少複雜的情況大大簡化。
在二進制的世界,只有 0 和 1 二個數字。我們的 3 是 11, 7 是 111,16 是 10000。用五個數位才表達到16這個數字,在現實世界難以想像有什麼用途。在100年前這是真的,因為當時還未有計算機。不過,今天我們都知道計算機或電腦的重要性,而它們都是二進數學的產物。
今天,我們要理解我們日常一個十進數字,比方說 1947,應理解為這個算式:
1 x 10^3 + 9 x 10^2 + 4 x 10^1 + 7 x 10^0
其中指數 0 是個位數,餘此類推。所謂二進制,就是將上述基數 10 改為 2,而數字則只有 1
或 0,這樣, 1011 就是:
1 x 2^3 + 0 x 2^2 + 1 x 2^1 + 1 x 2^0
化做十進數變成 11。
在 4x4x4 LED Matrix 實驗裏,每一層我有16粒LED需要控制。C 語言裏 int 有16 bit,本來足夠使用。但 int 要留1bit處理負數,所以要使用 unsigned int 來做控制碼。LED Matrix 是 4 層
架構,所以我用一個二維數 {層數, 亮著數字} 作為控制指令。
二進數學有很多有趣的特性,其布爾代數 (Boolean Algebra) 更是集成電路的根基。這裏不詳說了。
留言
張貼留言