官术网_书友最值得收藏!

2.3 比特、字節和二進制

“世界上只有10種人,理解二進制的和不理解二進制的。”

數字系統用數值來表示所有信息,但令人驚訝的是,這里使用的卻不是我們熟悉的以10為基數的十進制,而是二進制,也就是以2為基數的數制。

盡管每個人都或多或少地熟悉算術,但根據我的經驗,他們對數字含義的理解有時是不可靠的,至少在以10為基數(完全熟悉)和以2為基數(大多數人都不熟悉)之間進行類比時是這樣。我將在本節中嘗試解決這個問題,但是如果事情令人困惑,就不斷地對自己說:“這就像普通的數字,只不過是逢2進1而不是逢10進1而已。”

2.3.1 比特

表示數字信息的最基本的方法是用比特。正如本章開頭的引語所指出的,單詞“bit”是二進制數字“binary digit”的縮寫,由統計學家約翰·圖基(John Tukey)在20世紀40年代中期創造。據說,被稱為“氫彈之父”的愛德華·特勒更喜歡“bigit”這個詞,可惜這個詞并沒有流行起來。

單詞binary表示有兩個值的東西(前綴bi表示2),事實確實如此:比特是一個數字,它的值是0或1,沒有其他可能。這可以與十進制數字由0~9的10個可能值進行對比。使用單個比特,我們可以編碼或表示涉及從兩個值中挑選其中一個的任何選擇。這樣的二元選擇比比皆是:開/關、真/假、是/否、高/低、進/出、上/下、左/右、北/南、東/西等。一個單位就足以確定選擇了一對中的哪一個。例如,我們可以將0賦值為off,1賦值為on,反之亦然,只要每個人都同意哪個值代表哪個狀態。

圖2.7顯示了我打印機上的電源開關和在許多設備上看到的標準開關符號。它也是Unicode字符。

圖2.7 開關和標準開關符號

單個比特就足以表示開/關、真/假和類似的二元選擇,但我們需要一種方法來處理更多選擇或表示更復雜的事物。為此,我們使用一組比特,為0和1的不同可能組合賦值。例如,我們可以使用兩個比特來表示美國大學的四年:大一(00),大二(01),大三(10)和大四(11)。如果要增加一個類別,例如研究生,那么兩個比特是不夠的:會出現五個可能的值,但兩個比特只有四個不同的組合。三個比特就足夠了,然而實際上三個比特可以代表多達八種不同的事物,因此我們還可以算上教師、職員和博士后。組合將是000、001、010、011、100、101、110和111。

有一種模式將比特數與可以用這些數量的比特標記的項數相關聯。關系很簡單:如果有N個比特,則能表示的不同組合數量為2N,即2×2×…×2(N次),如圖2.8所示。

圖2.8 2的冪

這類似于十進制數字:如果有N個十進制數字,可以表示10N種不同情況,如圖2.9所示。

圖2.9 10的冪

2.3.2 2的冪和10的冪

由于計算機中的所有東西都是用二進制來處理的,所以像大小和容量這樣的屬性往往用2的冪表示。如果有N個比特,就有2N個可能的值,所以知道2的某個值的冪是很方便的,比如210

一旦數字變大,它們當然不值得記住。幸運的是,有一個可以很好地近似的捷徑:某些2的冪次值接近于10的冪次值,有一種易于記憶的規則,如圖2.10所示。圖2.10增加了一個描述大小的前綴peta或1015,它的發音像“pet”,而不是“Pete”。本書最后的詞匯表中包含了一個更大的表,里面有更多的單位。

圖2.10 2的冪和10的冪

隨著數值的增大,近似值變得更不準確,但在1015時,它也僅高出12.6%,所以在很大范圍內還是可用的。你會發現人們經常模糊2的冪和10的冪之間的區別(有時是朝著有利于他們試圖達到的某個目標的方向),所以1K可能用于表示1000,也可能表示210或1024。這通常是一個很小的區別,所以采用2和10的冪是對包含比特的大數進行心算的好方法。

2.3.3 二進制數值

如果按照通常的進位法則來解釋,那么一系列比特就可以表示一個數值,只不過此時的基數是2,而不是10。0~9的10位數字,足以給最多10個條目分配標簽。如果數量超過10,則必須使用更多位數字,比如兩位十進制數字可以表示的數值或標簽能達到100個,即00~99。多于100項的時候,就要用三位數字,其表示的范圍是1000,即000~999。對于普通的數字,我們通常不會寫出數值前導的零,但這些零是隱含的。另外,我們平時計數也是從1而非0開始的。

十進位數是10的冪的和的簡寫;例如,1867是1×103+8×102+6×101+7×100,也就是1×1000+8×100+6×10+7×1,即1000+800+60+7。在小學里,你可能稱這些為個位數,十位數,百位數等。這些我們是如此熟悉,以至于我們很少去想它。

二進制數也是一樣的,除了基數是2而不是10,以及所涉及的數字只有0和1。像11101這樣的二進制數被解釋為1×24+1×23+1×22+0×21+1×20,我們以10為基數表示為16+8+4+0+1,或29。

比特序列可以被解釋為數值,這意味著有一種自然的模式給條目分配二進制標簽:將它們按數值順序排列。前面我們看到了為大一、大二、大三、大四學生分配的標簽00、01、10、11,它們分別是十進制數值的0、1、2、3。接下來的序列是000、001、010、011、100、101、110、111,也就是十進制數值0~7。

下面我們做個練習,看你理解了多少。我們都很熟悉用手指數到10,但是如果你用手指(每個手指為一個數位!)代表一個二進制數,最多能數到多少?值的范圍有多大?如果你數到6時發現它的二進制表示是一個似曾相識的手勢,那說明我前面講的你都理解了。

前面我們都看到了,把二進制轉換成十進制很容易:只要把相應位置上值為1的2的對應次冪加起來即可。而把十進制轉換成二進制要難一些,但也不會難太多。反復地用2除十進制數。每次除完,把余數寫下來,余數要么是0,要么是1,然后再用2除商。這樣反復除下去,直到原來的數被除到等于0。最后得到的余數的序列,就是相應的二進制數,但順序相反,所以最后要將其倒轉。

舉例說明,圖2.11表示了將十進制數1 867轉換成二進制數的過程。反向讀取這些位,能得到111 0100 1011,把相應位上為1的2的對應次冪加起來可以驗算:1024+512+256+64+8+2+1=1867。

圖2.11 將十進制數1 867轉換為二進制數111 0100 1011

整個過程的每一步都會產生剩余數值的最低有效位(即最右邊的位)。其實,把一個很大秒數表示的時間轉換成日、時、分、秒的過程與此類似:除以60得到分鐘(余數是秒),結果除以60得到小時(余數是分鐘),結果再除以24得到天數(余數是小時)。區別在于時間轉換使用了不止一個基數,而是混合使用了60和24。

你也可以按照降冪的順序通過從原來的數字中逐個減去2的冪來將十進制轉換為二進制。從小于此數的2的最高次冪開始,比如從1867中減去210。每減去2的一個冪,就寫1,如果2的冪大于剩下的值,就寫0,就像在上面這個例子中27或者128的情況。最終得到的由“1”和“0”組成的序列就是二進制值。這種方法可能更直觀,但不那么機械化。

二進制算術很簡單,因為總共才兩個數字,加法和乘法表都只有兩行兩列,如圖2.12所示。雖然你將來不太可能自己動手做二進制算術,但這兩個表的簡單性其實也說明了為什么相對于十進制算術,執行二進制計算的計算機電路要簡單得多。

圖2.12 二進制加法和乘法表

2.3.4 字節

在所有現代計算機中,處理和存儲組織的基本單位是作為一個單位來處理的8個比特。一組8個比特被稱為1個字節,這個詞是由IBM的計算機架構師沃納·布赫霍爾茲在1956年創造的。1個字節可以編碼256個不同的值(28,8個0和1的所有不同組合),可以是0到255之間的整數,或7位ASCII字符集中的一個字符(有1個多余的位),或其他東西。通常,1個特定的字節是更大的字節組的一部分,這個字節組代表了一個更大或更復雜的事物。2個字節加起來提供16比特,足以表示0~216-1(或65535)之間的一個數字。這也可以表述Unicode字符表中的任意字符,也許是

這兩個字符中的其中一個;每個字符占2個字節。4個字節是32比特,這可能代表4個ASCII字符,或者2個Unicode字符,或者不大于232-1(約43億)的一個整數。一組字節能表示的內容不受限制,然而處理器本身定義了適當的特定分組,例如大小不同的整數,并且有處理這些分組的指令。

如果我們想記下一個或多個字節所代表的數值,我們可以用十進制形式表示。它本身就是數字,這對于人類讀者來說很方便。我們可以把它寫成二進制來查看單個的位,尤其是如果不同的位編碼不同種類的信息,這就很重要。但是,二進制很笨重,比十進制長三倍多,所以通常使用一種稱為十六進制的替代記數法。十六進制以16為基數,所以它有16個數字(就像十進制有10個數位,二進制有2個數位),這些數字是0、1、…、9、A、B、C、D、E和F。每個十六進制數字代表4個位,圖2.13用十六進制表示這些數值。

除非你是程序員,否則你只會在少數地方看到十六進制。其中之一是網頁顏色。之前提過,計算機中色彩的最通常的表示方式是使用3個字節來表示一個像素,分別代表紅、綠和藍的量,這稱為RGB編碼。每個組成都存儲在1個字節中,所以紅色、綠色和藍色的值各有256種可能,總共就是256×256×256種顏色,聽上去很多。我們可以用2和10的冪來快速估計下到底有多少種。也就是28×28×28,即224,或是22×220,或是16×106,或者說1600萬。你大概看到過用來描述計算機顯示器的數字:“超過1600萬種顏色!”這個估算其實比實際低了百分之五,224的實際數值為16777216。

圖2.13 十六進制數位及對應二進制數值表

強烈的紅色像素將被表示為FF0000,即紅色為十進制最大數255,沒有綠色,沒有藍色。而明亮但不強烈的藍色,就像許多網頁上的鏈接的顏色,將是0000CC。黃色是紅色加綠色,所以FFFF00可得到最亮的黃色,灰色的陰影有著等量的紅色、綠色和藍色,所以中等灰色像素為808080,也就是等量的紅綠藍。黑和白則分別是000000和FFFFFF。

十六進制值也用于Unicode編碼表以標識字符:

的十六進制編碼是67714EAC。第8章將會介紹用十六進制數表示的以太網地址,第10章會討論用十六進制數表示URL中的特殊字符。

有時候你會在計算機廣告中看到“64位”這個詞(“Windows10家庭版64位”),這是什么意思呢?計算機內部是以不同大小的塊處理數據的,這些塊包含數值,這些數值用32位和64位表示比較方便。地址也是如此,也就是主存中信息的存儲位置。前面提到的64位即指地址這個屬性。30年前地址從16位升級到了32位,這樣就足夠訪問4GB的內存了。現在,通用計算機從32位到64位的過渡也幾乎完成了。我不會試圖預測從64位到128位的過渡何時會發生,但64位應該會持續一段時間。

在所有這些關于比特和字節的討論中,要記住的關鍵是一組比特的意義取決于它們的上下文,單獨看它們自身數據是不知道其含義的。1個字節可以只用1個比特來表示真或假,另外7個空閑不用,也可以用來保存一個較小的整數,或者一個#之類的ASCII字符。它還可能是另一個書寫系統中的一個字符的一部分,也可能是一個2字節、4字節或8字節的更大數字的一部分,或者是一幅畫或一段音樂的一部分,甚至是供CPU執行的一條指令的一部分,還有很多其他的可能(這和十進制數的情況是一樣的。根據具體情況,一個3比特十進制數可以代表美國地區代碼、高速公路號碼、棒球擊球率或許多其他東西)。

一個程序的指令有時是另一個程序的數據。當你下載程序或手機應用時,它只是數據:一些被盲目復制的比特。但是當你運行這些程序時,處理器在處理時它們的比特就被當作指令處理。

主站蜘蛛池模板: 含山县| 太仓市| 冷水江市| 阿瓦提县| 芮城县| 余庆县| 公主岭市| 吉木乃县| 泰顺县| 陆良县| 台东市| 都安| 汾阳市| 阿克| 特克斯县| 东光县| 增城市| 广水市| 视频| 江西省| 蓬莱市| 万安县| 茂名市| 焦作市| 潼关县| 林州市| 稷山县| 乌兰县| 安国市| 海原县| 铁岭县| 四子王旗| 土默特右旗| 长武县| 肥东县| 夏河县| 达孜县| 建水县| 肇庆市| 乐山市| 泾阳县|