1. 中國(guó)古老的陰陽(yáng)八卦
首先我們看看《易傳·系辭上傳》,“易有太極,是生兩儀,兩儀生四象,四象生八卦。”從以下這個(gè)圖就很好理解:
細(xì)心的你也許會(huì)發(fā)現(xiàn),這是二進(jìn)制的級(jí)數(shù)增長(zhǎng),這不就是1,2,4,8么!
再看看,《道德經(jīng)》:道生一,一生二,二生三,三生萬(wàn)物。 這段話(huà),其實(shí)跟《易傳》的很像,意思是:
道是獨(dú)一無(wú)二的,道本身包含陰陽(yáng)二氣,陰陽(yáng)二氣相交而形成一種適勻的狀態(tài),萬(wàn)物在這種狀態(tài)中產(chǎn)生。
理工科出身的我,很容易想到,陰陽(yáng)便是0和1,陰陽(yáng)的相交,即0和1的組合,便可產(chǎn)生萬(wàn)物(計(jì)算機(jī)里面的一切)。 很多書(shū)都講這是古人的宇宙生成論或者是樸素的哲學(xué)概念,但這跟計(jì)算機(jī)里面的二進(jìn)制原理為什么這么相似,這么巧合? 2. 過(guò)去的信息傳遞在沒(méi)有電話(huà)和計(jì)算機(jī)的年代,人們是怎么記錄或傳遞信息的?狼煙烽火用來(lái)傳遞敵情(有和無(wú))
類(lèi)似的,還有紙鳶(風(fēng)箏)?,F(xiàn)在中國(guó)風(fēng)箏有倆流派,即“北濰坊,南陽(yáng)江”。
結(jié)繩
人們用來(lái)計(jì)數(shù)記事和傳遞信息。文字產(chǎn)生之前人們用來(lái)記數(shù)記事和傳遞信息的方法。相傳大事打大結(jié),小事打小結(jié)。
擊鼓鳴金看《三國(guó)演義》就會(huì)知道,里面多次提到擊鼓和鳴金。不同的方式和節(jié)奏傳遞不同的信息。
旗語(yǔ)在軍事上也用的非常多。
故夜戰(zhàn)多火鼓,晝戰(zhàn)多旌旗,所以變?nèi)酥恳病?/p>
《孫子兵法》
諸如此類(lèi)的,還有很多很多,如飛鴿傳書(shū)、魚(yú)傳尺素等。 3. 近現(xiàn)代的電子信息首先看看電報(bào)
歐洲的科學(xué)家在18世紀(jì)逐漸發(fā)現(xiàn)電的各種特質(zhì)。同時(shí)開(kāi)始有人研究使用電來(lái)傳遞訊息的可能。早在1753年,一名英國(guó)人便提出使用靜電來(lái)拍發(fā)電報(bào)。
還有摩斯密碼
摩爾斯電碼也被稱(chēng)作摩斯密碼,是一種時(shí)通時(shí)斷的信號(hào)代碼,通過(guò)不同的排列順序來(lái)表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)。它發(fā)明于1837年,是一種早期的數(shù)字化通信形式。不同于現(xiàn)代化的數(shù)字通訊,摩爾斯電碼只使用零和一兩種狀態(tài)的二進(jìn)制代碼,它的代碼包括五種:短促的點(diǎn)信號(hào)“?”,讀“滴”(Di)保持一定時(shí)間的長(zhǎng)信號(hào)“—”,讀“嗒”(Da)表示點(diǎn)和劃之間的停頓、每個(gè)詞之間中等的停頓,以及句子之間長(zhǎng)的停頓。
電子計(jì)算機(jī)到1946年,世界第一臺(tái)電子計(jì)算機(jī)誕生了。它是一個(gè)龐然大物,用了18000個(gè)電子管,占地170平方米,重達(dá)30噸,耗電功率約150千瓦,每秒鐘可進(jìn)行5000次運(yùn)算。 這個(gè)功能性能,從現(xiàn)在看來(lái)雖然很渣,但是其誕生具有劃時(shí)代意義。 發(fā)明計(jì)算機(jī)的同學(xué)們用8個(gè)晶體管的“通”或“斷”組合出一些狀態(tài)來(lái)表示世間萬(wàn)物。
在這里,不得不提一個(gè)人——馮·諾依曼。他是匈牙利裔美籍?dāng)?shù)學(xué)家、物理學(xué)家、計(jì)算機(jī)科學(xué)家,在計(jì)算機(jī)、博弈論、核武器和生化武器等領(lǐng)域的全才之一,被后來(lái)人稱(chēng)為“計(jì)算機(jī)之父”和“博弈論之父”。 我們今天用到的計(jì)算機(jī),都是基于馮諾依曼體系結(jié)構(gòu)的。4. 字節(jié)講了這么多,現(xiàn)在開(kāi)始講字節(jié),開(kāi)始之前,先復(fù)習(xí)下幾個(gè)概念:
比特(bit):也可稱(chēng)為“位”,是計(jì)算機(jī)信息中的最小單位,是 binary digit(二進(jìn)制數(shù)位)的縮寫(xiě),指二進(jìn)制中的一位
字節(jié)(Byte):計(jì)算機(jī)中信息計(jì)量的一種單位,一個(gè)位就代表“0”或“1”,每8個(gè)位(bit)組成一個(gè)字節(jié)(Byte)
字符(Character):文字與符號(hào)的總稱(chēng),可以是各個(gè)國(guó)家的文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等
字符集(Character Set):是多個(gè)字符的集合
編碼(Encoding):信息從一種形式或格式轉(zhuǎn)換為另一種形式的過(guò)程
解碼(decoding):編碼的逆過(guò)程
字符編碼(Character Encoding):按照何種規(guī)則存儲(chǔ)字符
我們知道字節(jié)(Byte)是計(jì)算機(jī)信息存儲(chǔ)的基本單位,它由8個(gè)位(bit)組成。但是,為什么是8個(gè)位,而不是三個(gè)四個(gè),也不是九個(gè)十個(gè)? 網(wǎng)上很多都說(shuō)是因?yàn)锳SCII,其實(shí)不是,這不是因果關(guān)系。 位(bit),一個(gè)位只有兩種狀態(tài),0和1,可表示晶體管的“通”和“斷”,計(jì)算機(jī)的存儲(chǔ)和邏輯就是通過(guò)這些晶體管的“通”和“斷”來(lái)表達(dá)。 早期的計(jì)算機(jī)是用來(lái)做數(shù)學(xué)運(yùn)算的,數(shù)字就0~9,其實(shí)4個(gè)bit就足夠了,可以通過(guò)BCD碼的方式來(lái)表達(dá)數(shù)字。 但是,不能用4個(gè)bit來(lái)表示一個(gè)Byte啊,4個(gè)bit表示數(shù)字還好,其他字母呢,那得用兩個(gè)byte來(lái)表示,跨byte訪問(wèn),會(huì)降低效率啊。 歷史上,早期的Byte的大小沒(méi)有固定的標(biāo)準(zhǔn),其很大程度依賴(lài)于硬件設(shè)計(jì),使用1到48位的情況都有,但比較常用的是6位(BCDIC)。使用6位和9位的計(jì)算機(jī)在19世紀(jì)60年代非常常見(jiàn),這些系統(tǒng)通常具有12、18、24、30、36、48或60位的存儲(chǔ)。
4位和6位也是在早期比較常用的,它們當(dāng)時(shí)被用在美國(guó)陸軍(FIELDATA)和海軍常見(jiàn)的可打印圖形模式。這些表示包括字母數(shù)字字符和特殊的圖形符號(hào)。這些集合在1963年擴(kuò)展為7位編碼,稱(chēng)為美國(guó)信息交換標(biāo)準(zhǔn)代碼(ASCII),稱(chēng)為聯(lián)邦信息處理標(biāo)準(zhǔn),取代了1960年代美國(guó)政府和大學(xué)不同部門(mén)使用的不兼容的電傳打印機(jī)代碼。這個(gè)就是ASCII的由來(lái)。呵呵,ASCII字符其實(shí)用7位就夠了,不是8位哦。
那么今天的8位Byte是怎么來(lái)的呢? 這就要提到System/360了。在十九世紀(jì)60年代初期,IBM同時(shí)積極參與ASCII標(biāo)準(zhǔn)化,同時(shí)在System/360產(chǎn)品線(xiàn)中引入了八位擴(kuò)展二進(jìn)制編碼十進(jìn)制交換碼(EBCDIC),這是對(duì)六位二進(jìn)制編碼十進(jìn)制(BCDIC)的擴(kuò)展。IBM突出的表現(xiàn),逐漸就讓8位Byte普及開(kāi)來(lái)了。
但是呢,這個(gè)EBCDIC和ASCII是不一樣的哦。 十九世紀(jì)70年代八位微處理器的發(fā)展普及了這種存儲(chǔ)容量。早期的計(jì)算機(jī)如Intel的8088、8086是可以通過(guò)4位訪問(wèn)的哦,那時(shí)叫做半字節(jié)。 也許你用過(guò)8位單片機(jī),但是你聽(tīng)說(shuō)過(guò)4位單片機(jī)嗎?哈哈!5. 進(jìn)制我們最熟知的是十進(jìn)制,從小接觸的數(shù)字和算術(shù)計(jì)算用的都是十進(jìn)制。然后學(xué)到信息計(jì)算機(jī)相關(guān)知識(shí)了,就開(kāi)始接觸或認(rèn)識(shí)二進(jìn)制。上面也提到了,陰陽(yáng)八卦用的就是二進(jìn)制。其實(shí)二進(jìn)制普遍存于大自然中,也存在于生活中。 那么除了十進(jìn)制、二進(jìn)制,還有哪些進(jìn)制呢?八進(jìn)制、十六進(jìn)制等等。
這些都是程序員熟悉的。 講了這么多,什么是進(jìn)制? 進(jìn)制就是進(jìn)位計(jì)數(shù)制,是人為定義的帶進(jìn)位的計(jì)數(shù)方法。十進(jìn)制是逢十進(jìn)一,二進(jìn)制是逢二進(jìn)一,十六進(jìn)制是逢十六進(jìn)一,那么X進(jìn)制就是逢X進(jìn)一了。 進(jìn)制在數(shù)字上怎么表示? 也很簡(jiǎn)單,進(jìn)制小于10的,用阿拉伯?dāng)?shù)字就很容易表達(dá)出來(lái)。
如:十進(jìn)制:0, 1, 2, 3,4, 5, 6, 7, 8,9,10。這個(gè)10就是逢十進(jìn)一變成兩位數(shù)了。八進(jìn)制:0, 1,2,3,4,5, 6,7,10。這個(gè)10就是逢八進(jìn)一變成兩位數(shù)了,按數(shù)值計(jì)算,這個(gè)八進(jìn)制的10相當(dāng)于十進(jìn)制的9,是表達(dá)形式變了。二進(jìn)制:0, 1,10。這個(gè)10就是逢二進(jìn)一變成兩位數(shù)了。 那么進(jìn)制大于10的呢,如十六進(jìn)制怎么表示?十六進(jìn)制:0, 1,2,3,4,5, 6,7,8,9,A, B, C, D, E, F, 10。這個(gè)10就是逢十六進(jìn)一變成兩位數(shù)了。因?yàn)榘⒗當(dāng)?shù)字沒(méi)有單一數(shù)字表達(dá)的10, 11, 12, 13, 14, 15,所以采用A, B, C, D, E, F來(lái)表達(dá),只是表達(dá)形式不一樣而已。 上面我們提到了個(gè)BCD碼,啥是BCD碼?十六進(jìn)制又是什么鬼?
十進(jìn)制 | 二進(jìn)制 | 八進(jìn)制 | 十六進(jìn)制 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 100 | 10 |
于是,可以約定,這些進(jìn)制的表達(dá)方式,不然10到底是幾進(jìn)制的表達(dá)的數(shù)字是多少都不知道。 二進(jìn)制用B(Binary)來(lái)表達(dá),如1001B,但是編程語(yǔ)言中最小的單位是Byte,所以沒(méi)有約定表達(dá)二進(jìn)制的方法。 八進(jìn)制用O(Oct)來(lái)表達(dá),寫(xiě)成123O?這個(gè)O和0寫(xiě)法相近,會(huì)讓人誤解的,好困惑哦。在編程語(yǔ)言中,通常在數(shù)字前面加個(gè)0,即0123表示八進(jìn)制的123,注意跟十進(jìn)制的123不相等哦。 十六進(jìn)制用H(Hex)表示,如2BH,編程語(yǔ)言中用0x開(kāi)頭來(lái)表示,如0x2B。 這里為什么提二進(jìn)制、十進(jìn)制、八進(jìn)制和十六進(jìn)制呢?
十進(jìn)制剛才說(shuō)了,是最常見(jiàn)接觸最多的進(jìn)制,而二進(jìn)制是計(jì)算機(jī)的基本進(jìn)制,但計(jì)算機(jī)通常以8 Bit的Byte來(lái)作為基本單位,那么一個(gè)Byte的剛好可以表示16個(gè)數(shù),所以,十六進(jìn)制是非常常用的,而八進(jìn)制就是對(duì)于半個(gè)Byte了。 好了,問(wèn)題來(lái)了,除了這些常見(jiàn)了,有沒(méi)有三進(jìn)制呢,十七進(jìn)制呢?答案是有的,隨你喜歡,多少都行。 Python中有個(gè)int的內(nèi)置函數(shù),可以轉(zhuǎn)換各種進(jìn)制。以下看看100這個(gè)數(shù)在各個(gè)進(jìn)制中對(duì)應(yīng)的十進(jìn)制數(shù)值是多少。
>>> int('100', 2)4>>> int('100', 3)9>>> int('100', 4)16>>> int('100', 7)49>>> int('100', 8)64>>> int('100', 10)100>>> int('100', 16)256>>> int('100', 17)289>>> int('100', 35)1225>>> int('100', 36)1296>>> int('100', 55)Traceback (most recent call last): File "
BCD碼(Binary-Coded Decimal?),用4位二進(jìn)制數(shù)來(lái)表示1位十進(jìn)制數(shù)中的0~9這10個(gè)數(shù)碼,是一種二進(jìn)制的數(shù)字編碼形式,用二進(jìn)制編碼的十進(jìn)制代碼。
如果不懂這個(gè)概念,要認(rèn)真讀幾次上面這段話(huà)。簡(jiǎn)單地理解為,1位十進(jìn)制數(shù)碼用4位二進(jìn)制數(shù)來(lái)表示,但根據(jù)這1位十進(jìn)制數(shù)碼和4位二進(jìn)制數(shù)的對(duì)應(yīng)關(guān)系(或者表達(dá)關(guān)系)不一樣而有不同的形式,如8421碼、2421碼、5421碼和余3碼、余3循環(huán)碼、格雷碼,其中前面三種是有權(quán)碼,后面三種是無(wú)權(quán)碼。
有權(quán)碼,自然二進(jìn)制代碼是按照二進(jìn)制代碼各位權(quán)值大小,以自然向下加一,逢二進(jìn)一的方式來(lái)表示數(shù)值的大小所生成的代碼。
顯然,n位自然二進(jìn)制代碼共有2^n種狀態(tài)取值組合,由于代碼中各位的位權(quán)值分別為2^3,2^2,2^1,2^0,即8421,所以也稱(chēng)為8421碼。這樣每位二進(jìn)制碼元都有確定位權(quán)值的編碼,稱(chēng)為有權(quán)碼,屬于恒權(quán)代碼。相應(yīng)的,沒(méi)有確定位權(quán)值的編碼叫無(wú)權(quán)碼,也叫非恒權(quán)代碼。
百度百科——有權(quán)碼
8421碼8421 BCD碼是最基本和最常用的BCD碼,0~9的8421碼與4位自然二進(jìn)制形式完全一樣,即用0000~1001分別代表它所對(duì)應(yīng)的十進(jìn)制數(shù)。要計(jì)算一個(gè)多位的8421碼可以每位單獨(dú)拆分出來(lái),并算出對(duì)應(yīng)的二進(jìn)制碼(不足四位前面補(bǔ)0),然后拼起來(lái)即可。舉個(gè)例子: 8421碼:235,拆分出來(lái)是2、3、5,分別對(duì)應(yīng)二進(jìn)制是0010、0011、1001,拼起來(lái)是0010 0011 1001。
5421和2421
5421 BCD碼和2421 BCD碼,這兩種有權(quán)BCD碼中,有的十進(jìn)制數(shù)碼存在兩種加權(quán)方法,例如,5421 BCD碼中的數(shù)碼5,既可以用1000表示,也可以用0101表示;2421 BCD碼中的數(shù)碼6,既可以用1100表示, 也可以用0110表示。這說(shuō)明5421 BCD碼和2421 BCD碼的編碼方案都不是惟一的。 下面列舉8421碼、2421碼、5421碼和一位十進(jìn)制數(shù)的對(duì)照關(guān)系。
十進(jìn)制數(shù) | 8421碼 | 5421碼 | 2421碼 |
0 | 0000 | 0000 | 0000 |
1 | 0001 | 0001 | 0001 |
2 | 0010 | 0010 | 0010 |
3 | 0011 | 0011 | 0011 |
4 | 0100 | 0100 | 0100 |
5 | 0101 | 1000 | 1011 |
6 | 0110 | 1001 | 1100 |
7 | 0111 | 1010 | 1101 |
8 | 1000 | 1011 | 1110 |
9 | 1001 | 1100 | 1111 |
余3碼和余3循環(huán)碼余3碼實(shí)很簡(jiǎn)單,是8421 BCD碼的每個(gè)碼組加3(0011)形成的。為什么有余3碼這個(gè)東西呢,實(shí)際上其常用于BCD碼的運(yùn)算電路中。 余3循環(huán)碼實(shí)際上是變權(quán)碼,每一位的1并不代表固定的數(shù)值,十進(jìn)制數(shù)的余3循環(huán)碼就是取4位格雷碼中的十個(gè)代碼組成。 那么什么是格雷碼?格雷碼格雷碼(Gray Code),其由很多曾用名,如格萊碼、戈萊碼、循環(huán)碼、反射二進(jìn)制碼、最小差錯(cuò)碼等。 格雷碼有很多種表現(xiàn)形式
為什么要用格雷碼呢?
格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,其循環(huán)和單步特性消除了隨機(jī)取數(shù)時(shí)出現(xiàn)重大錯(cuò)誤的可能,其反射和自補(bǔ)特性使得對(duì)其進(jìn)行求反操作也非常方便,所以,格雷碼屬于一種可靠性編碼,是一種錯(cuò)誤最小化的編碼方式,因此格雷碼在通信和測(cè)量技術(shù)中得到廣泛應(yīng)用。
格雷碼屬于可靠性編碼,是一種錯(cuò)誤最小化的編碼方式。因?yàn)?,雖然自然二進(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號(hào),但在某些情況,例如從十進(jìn)制的3轉(zhuǎn)換為4時(shí)二進(jìn)制碼的每一位都要變,能使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。
格雷碼Gray Code詳解(https://www.cnblogs.com/zhuruibi/p/8988044.html)
怎么計(jì)算格雷碼? 二進(jìn)制碼→格雷碼(編碼): 此方法從對(duì)應(yīng)的n位二進(jìn)制碼字中直接得到n位格雷碼碼字,步驟如下:
對(duì)n位二進(jìn)制的碼字,從右到左,以0到n-1編號(hào)
如果二進(jìn)制碼字的第i位和i+1位相同,則對(duì)應(yīng)的格雷碼的第i位為0,否則為1(當(dāng)i+1=n時(shí),二進(jìn)制碼字的第n位被認(rèn)為是0,即第n-1位不變)
責(zé)任編輯:xj
原文標(biāo)題:古人哲學(xué)居然與計(jì)算機(jī)信息編碼不謀而合?
文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
761瀏覽量
41476 -
編程
+關(guān)注
關(guān)注
88文章
3521瀏覽量
93269 -
信息編碼
+關(guān)注
關(guān)注
0文章
9瀏覽量
9235
原文標(biāo)題:古人哲學(xué)居然與計(jì)算機(jī)信息編碼不謀而合?
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論