陳凱
為什么當(dāng)前的計(jì)算機(jī)主要使用二進(jìn)制處理信息呢?這個(gè)問(wèn)題當(dāng)然難不倒大家,因?yàn)殡娮釉幚矶M(jìn)制數(shù)據(jù)比較容易,“0”和“1”代表兩個(gè)完全不一樣的物理狀態(tài),存儲(chǔ)和識(shí)別比較容易,轉(zhuǎn)換起來(lái)方便快捷。雖然問(wèn)題回答起來(lái)并不難,不過(guò)通過(guò)文字了解是一回事,親身體驗(yàn)領(lǐng)悟又是另一回事,由于在課堂上很難直觀(guān)地觀(guān)察到電子元件處理數(shù)據(jù)的過(guò)程,所以不妨通過(guò)游戲讓學(xué)習(xí)者真切地體驗(yàn)到二進(jìn)制的優(yōu)勢(shì)。
● 用Flappy Bird傳輸數(shù)據(jù)
提起Flappy Bird很多人都知道,網(wǎng)絡(luò)上有不少網(wǎng)友自編的模仿Flappy Bird游戲的源代碼,稍加改造就可以作為教學(xué)工具。限于篇幅這里不給出完整的代碼,大家可自行上網(wǎng)搜索。
改造后的游戲是這樣的:小鳥(niǎo)所通過(guò)的每列障礙由7個(gè)管子和1個(gè)空檔組成,空檔在哪里并不是隨機(jī)的,如要傳遞八進(jìn)制的數(shù)據(jù)“325”,就需要在第3個(gè)、第2個(gè)及第5個(gè)管子后開(kāi)出空檔,若小鳥(niǎo)順利通過(guò)全部的三個(gè)空檔而沒(méi)有撞到管子,就表示順利傳遞了“325”這個(gè)數(shù)據(jù)。只要是認(rèn)真玩過(guò)Flappy Bird的人,就知道完成這個(gè)任務(wù)是非常困難的(如圖1)。
圖1
為了更方便地傳遞數(shù)據(jù),可以把八進(jìn)制的“325”轉(zhuǎn)換成二進(jìn)制“11010101”,雖然“325”里只有3個(gè)符號(hào),而“11010101”里有8個(gè)符號(hào),但因?yàn)槲锢頎顟B(tài)只有兩種,所以小鳥(niǎo)通過(guò)管道的騰挪空間可以大幅度增加。小鳥(niǎo)需要通過(guò)障礙的數(shù)量增加了,但游戲難度反而大大降低(如圖2)。
圖2
通過(guò)這個(gè)游戲就可以看出,在有限的信息處理空間中,使用二進(jìn)制有助于保證數(shù)據(jù)傳輸?shù)姆€(wěn)定性。
● 用游戲棋做二進(jìn)制運(yùn)算
假設(shè)有3個(gè)二進(jìn)制數(shù),分別是“101”
“1111”和“1001”,用棋子(或積木)代表1,空檔代表0,將這3個(gè)二進(jìn)制數(shù)分三行擺好(如圖3)。
圖3
游戲規(guī)則非常簡(jiǎn)單:每個(gè)棋子都可以向上移動(dòng),一次只能移動(dòng)一顆棋子,但不能往其他方向移;如棋子移動(dòng)時(shí)遇到另一個(gè)棋子,則可以將阻擋它移動(dòng)的棋子吃掉,吃掉阻擋物后,當(dāng)前棋子再向左移動(dòng)一格。當(dāng)所有棋子處于同一行時(shí),游戲結(jié)束(如圖4)。
然后根據(jù)這個(gè)規(guī)則,對(duì)初始的圖形進(jìn)行變化,先移動(dòng)哪個(gè)棋子后移動(dòng)哪個(gè)棋子其實(shí)無(wú)所謂,最后結(jié)果總是一樣的(如下頁(yè)圖5)。
在圖5的例子中,最后的結(jié)果是“11101”,其實(shí),把“101”“1111”和“1001”3個(gè)二進(jìn)制數(shù)加起來(lái),得到的正是“11101”。這個(gè)游戲說(shuō)明,只要使用很簡(jiǎn)單的規(guī)則,就可以實(shí)現(xiàn)針對(duì)二進(jìn)制數(shù)的數(shù)學(xué)運(yùn)算。稍微改一下規(guī)則,還能做二進(jìn)制減法,大家能想出做減法的規(guī)則應(yīng)當(dāng)如何制定嗎?