你看不懂的 0101,其實才是成為程式高手的關鍵!

解開駭客電影裡的綠色數字之謎,讓程式邏輯徹底升級

「世界上有 10 種人,懂二進制和不懂的。」

這句玩笑揭示了現代資訊世界的一個秘密:0 和 1 的二進制數字是電腦的基石。它把人分為兩種,懂二進制與不懂的人。你可能很好奇,這句話不是說 10 種人嗎?怎麼語意上只有兩種呢?
容我先賣個關子,讓我娓娓道來~

要了解二進制,我可以先從最貼近我們日常的十進制開始。簡單來說,就是數字:「0、1、2、3、4、5、6、7、8、9」。當數字到 9 之後,再進位變成 10,這就是簡單的十進制。
它會這麼普及是因為人類有 10 根手指,所以對它比較好理解,也更容易運用在生活中。

而二進制和十進制概念一樣,只是它是數字達到 2 就進位(因為二進制只有 0 和 1)。
舉例:
• 0 + 1 = 1(不用進位)
• 1 + 1 = 10(進位,右邊變 0,左邊進 1)
• 11 + 1 = 100(進位,右邊變 00,左邊進 1)
• 111 + 1 = 1000(進位,右邊變 000,左邊進 1)

那二進制是怎麼來的?

早在電腦發明之前,人類就已經接觸到二進制的概念。
比如中國《易經》裡面使用陰爻與陽爻(⚋、⚊)構成了六十四卦,可以視為六位二進制數組合(陰爻相當於 0,陽爻相當於 1)。

到了 17 世紀,德國數學家萊布尼茲首次從理論上系統闡述了二進制。他也將二進制正式帶入數學領域。

到了 20 世紀,美國數學家香農首次用繼電器開關電路實現了布爾代數和二進制運算。香農這篇題為《繼電器與開關電路的符號分析》的論文,被認為奠定了數位電路設計的實際基礎。

早期電腦工程師們(如貝爾實驗室的斯蒂比茨與德國的祖斯)紛紛研製基於繼電器或電子管的二進制計算機。
由此,二進制從數學理論走進工程實踐,成為電腦世界的通用語言。

簡單來說,人類很早就有二進制的概念,後來發現原來二進制非常適合電腦的設計。所以,往後的電腦都是以二進制的路線發展,而不是更複雜的八進制、十進制、十六進制等等。


駭客任務裡的 0 與 1

小時候看《駭客任務》,螢幕上那些密密麻麻、綠色的 0101 數字讓我覺得超帥。
雖然當時完全不懂它們的意義,但我知道,接下來一定會發生什麼刺激又神秘的事!

還記得 2000 年左右,駭客主題的電影風靡一時。那時候駭客在人們眼中應該是個很神秘的存在,電影裡的駭客總是在電腦螢幕前敲擊鍵盤,畫面上不斷閃爍 0101 的數字特效。但對於小時候的我來說,這些符號的真正含義仍是一團謎,只知道它代表著某種酷炫的未來感。

直到我在學習程式的過程中卡關,開始去補齊各種電腦原理的基礎,我赫然發現原來當年電影裡出現的 0 與 1 就是電腦運作的基礎。
所有數據和指令最終都會以二進制的形式進行存儲和運算,在電腦的世界裡,0 與 1 可以代表一切事物。

而在我們看來的數字 0 跟 1,電腦這機器是怎麼理解的呢?
這跟電腦裡的晶片有關,就是所謂現代的處理器(CPU、GPU),而晶片裡充滿著密密麻麻的電晶體。

這些電晶體是一個「電子開關」,可以切換「開」和「關」,對應到 1 和 0。當施加電壓時,電晶體會導通(1);當沒有電壓時,它會關閉(0)。所以,這些數以千億的電晶體同時切換開關,就會出現像駭客任務裡的0101010101的數字,構成我們在電腦裡看到的一切。

而《駭客任務》裡的這些流動的綠色數字,就是這個模擬世界的底層數據。只有像尼歐(Neo)這樣的駭客/覺醒者,才能「看穿」這些數據,理解它們代表的現象,從而擁有超能力。


所有一切都是 0 與 1

那你一定很好奇,0 跟 1 是怎麼代表一切事物的?它怎麼代表數字?那中文字呢?
例如,怎麼知道數字 56 所代表的 0 跟 1?這其實都是有辦法算出來的。

首先要將 56 轉換成二進制(Binary),可以使用「除 2 取餘數,逆序排列」的方法~

步驟:

  1. 56 ÷ 2 = 28,餘 0
  2. 28 ÷ 2 = 14,餘 0
  3. 14 ÷ 2 = 7,餘 0
  4. 7 ÷ 2 = 3,餘 1
  5. 3 ÷ 2 = 1,餘 1
  6. 1 ÷ 2 = 0,餘 1(停止)

從下往上讀取餘數,得到:56 的二進制是 111000(即 56 = 111000)。
所以當我們輸入數字 56 時,在電腦看來它就是 111000 這串數字,背後就是電晶體開關開關的結果。

那我們熟悉的中文字呢?電腦是怎麼用 0 跟 1 來代表它們的?
其實我們每次所輸入的每一個字,電腦都在背後偷偷透過查字典的方式找到對應的中文字。

比如你打出「我愛你」,在電腦看來是長這樣:

• 「我」→ 假設編號是 0100110101110001
• 「愛」→可能是編號 011001010110
• 「你」→可能是 101010111001
(以上數字只是舉例說明,不是真實編號)

電腦看到一串像 011001010110 這種二進制編號後,就會去查號碼表,發現「喔!這是中文字『愛』。」而這張編號表在電腦裡,叫做「字元編碼表」(例如:常見的 Unicode 編碼表)。而每個中文字都對應著一組二進制編號,可想而知這儲存量是多到嚇人啊!

再舉個最常見的例子:QR Code。

大家有沒有想過,為什麼一個簡簡單單、由黑白點構成的 QR Code 裡,可以掃描出資訊?
其實原理也很簡單。在電腦看來,QR Code 就是一組密密麻麻的 0 跟 1:

  • 黑色方塊代表「1」
  • 白色方格代表「0」

透過掃描得到編碼後,按照 QR Code 固定的規則(編碼標準),把這些 0 和 1 轉換成文字、數字、網址或其他資訊。

所以在電腦的視角看來,一切皆是 0 與 1。而若是我們能用電腦的視角來看待事物,這對我們學習編程必定有很大的幫助。


理解二進制對學習程式有什麼幫助?

以我的學習角度來說,在學習 JavaScript 的時候,我經常碰到像布林值(True 與 False)或條件判斷(if 與 else if)這類語法。

其實我一開始是不理解為什麼要以這種方式去寫判斷,所以往往過程中都是以死記硬背的方式去寫程式和學習。這讓我在後期寫程式作業時常常卡關,因為一旦題目發生變化,我就無法靈活應用或換個角度思考。這一度讓我很懊惱。

直到有一天,我和前端工程師的朋友聊完後才發現,根本原因在於我的基礎邏輯根本不夠清晰啊!所以當全部組合在一起時就完全不會了…

當下我覺得,如果我能更理解電腦的運作方式,對我的學習是不是會更有幫助呢?

於是我進一步去了解二進制運算和 0 跟 1 的概念。(這邊跟大家說一下,用 ChatGPT 搜尋和整理資料幫助我更快理解二進制,所以大家要好好善用 AI )確實,在對二進制有了一定理解之後,我在寫程式時逐漸養成以 0 和 1 的方式去思考條件判斷的習慣。

例如:

  • 這一行判斷如果是 True,會進入哪個情境?
  • 若是 False,又會產生哪些不同的結果?

透過這種轉換後的思考方式,我對條件判斷以及背後邏輯的理解變得更為深刻,也能更靈活地應付題目的變化。相信對於後面學習更複雜的運算,也是非常有幫助,所謂基礎打穩了~後面就穩了~

因為原理其實非常單純,所有複雜的算法和判斷,背後都是透過 0 與 1、True 或 False,這種看似簡單的方式組合出各種複雜的算法與判斷。

講到這裡,算是都介紹完讓人難懂的二進制~

回到開頭的玩笑:「世界上有 10 種人,懂二進制和不懂的。」

那麼現在的你,屬於哪一種人呢?