當前位置:首頁 > 公眾號精選 > 嵌入式ARM
[導讀]理工科出身的我,很容易想到,陰陽便是0和1,陰陽的相交,即0和1的組合,便可產生萬物(計算機裏面的一切)。

1. 中國古老的陰陽八卦

首先我們看看《易傳·繫辭上傳》,“易有太極,是生兩儀,兩儀生四象,四象生八卦。”從以下這個圖就很好理解:

細心的你也許會發現,這是二進制的級數增長,這不就是1,2,4,8麼!

再看看,《道德經》:道生一,一生二,二生三,三生萬物。
這段話,其實跟《易傳》的很像,意思是:

道是獨一無二的,道本身包含陰陽二氣,陰陽二氣相交而形成一種適勻的狀態,萬物在這種狀態中產生。

理工科出身的我,很容易想到,陰陽便是0和1,陰陽的相交,即0和1的組合,便可產生萬物(計算機裏面的一切)。
很多書都講這是古人的宇宙生成論或者是樸素的哲學概念,但這跟計算機裏面的二進制原理為什麼這麼相似,這麼巧合?

2. 過去的信息傳遞
在沒有電話和計算機的年代,人們是怎麼記錄或傳遞信息的?
狼煙烽火
用來傳遞敵情(有和無)

類似的,還有紙鳶(風箏)。現在中國風箏有倆流派,即“北濰坊,南陽江”。

結繩

人們用來計數記事和傳遞信息。文字產生之前人們用來記數記事和傳遞信息的方法。相傳大事打大結,小事打小結。
擊鼓鳴金
看《三國演義》就會知道,裏面多次提到擊鼓和鳴金。不同的方式和節奏傳遞不同的信息。
旗語
在軍事上也用的非常多。

故夜戰多火鼓,晝戰多旌旗,所以變人之耳目也。

《孫子兵法》
諸如此類的,還有很多很多,如飛鴿傳書、魚傳尺素等。

3. 近現代的電子信息
首先看看 電報

歐洲的科學家在18世紀逐漸發現電的各種特質。同時開始有人研究使用電來傳遞訊息的可能。早在1753年,一名英國人便提出使用靜電來拍發電報。

百度百科
還有 摩斯密碼

摩爾斯電碼也被稱作摩斯密碼,是一種時通時斷的信號代碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號。它發明於1837年,是一種早期的數字化通信形式。不同於現代化的數字通訊,摩爾斯電碼只使用零和一兩種狀態的二進制代碼,它的代碼包括五種:短促的點信號“・”,讀“滴”(Di)保持一定時間的長信號“—”,讀“嗒”(Da)表示點和劃之間的停頓、每個詞之間中等的停頓,以及句子之間長的停頓。

百度百科
電子計算機
到1946年,世界第一台電子計算機誕生了。它是一個龐然大物,用了18000個電子管,佔地170平方米,重達30噸,耗電功率約150千瓦,每秒鐘可進行5000次運算。
這個功能性能,從現在看來雖然很渣,但是其誕生具有劃時代意義。
發明計算機的同學們用8個晶體管的“通”或“斷”組合出一些狀態來表示世間萬物。
在這裏,不得不提一個人——馮·諾依曼。他是匈牙利裔美籍數學家、物理學家、計算機科學家,在計算機、博弈論、核武器和生化武器等領域的全才之一,被後來人為“計算機之父”和“博弈論之父”。
我們今天用到的計算機,都是基於馮諾依曼體系結構的。
4. 字節
講了這麼多,現在開始講字節,開始之前,先複習下幾個概念:

比特(bit):也可稱為“位”,是計算機信息中的最小單位,是 binary digit(二進制數位) 的 縮寫,指二進制中的一位 

字節(Byte):計算機中信息計量的一種單位,一個位就代表“0”或“1”,每8個位(bit)組成一個字節(Byte) 

字符(Character):文字與符號的總稱,可以是各個國家的文字、標點符號、圖形符號、數字等 

字符集(Character Set):是多個字符的集合 

編碼(Encoding): 信息從一種形式或格式轉換為另一種形式的過程 

解碼(decoding): 編碼的逆過程 

字符編碼(Character Encoding): 按照何種規則存儲字符

我們知道字節(Byte)是計算機信息存儲的基本單位,它由8個位(bit)組成。但是,為什麼是8個位,而不是三個四個,也不是九個十個?
網上很多都説是因為ASCII,其實不是,這不是因果關係。
位(bit),一個位只有兩種狀態,0和1,可表示晶體管的“通”和“斷”,計算機的存儲和邏輯就是通過這些晶體管的“通”和“斷”來表達。
早期的計算機是用來做數學運算的,數字就0~9,其實4個bit就足夠了,可以通過BCD碼的方式來表達數字。
但是,不能用4個bit來表示一個Byte啊,4個bit表示數字還好,其他字母呢,那得用兩個byte來表示,跨byte訪問,會降低效率啊。
歷史上,早期的Byte的大小沒有固定的標準,其很大程度依賴於硬件設計,使用1到48位的情況都有,但比較常用的是6位(BCDIC)。使用6位和9位的計算機在19世紀60年代非常常見,這些系統通常具有12、18、24、30、36、48或60位的存儲。

4位和6位也是在早期比較常用的,它們當時被用在美國陸軍(FIELDATA)和海軍常見的可打印圖形模式。這些表示包括字母數字字符和特殊的圖形符號。這些集合在1963年擴展為7位編碼,稱為美國信息交換標準代碼(ASCII),稱為聯邦信息處理標準,取代了1960年代美國政府和大學不同部門使用的不兼容的電傳打印機代碼。 這個就是ASCII的由來。呵呵,ASCII字符其實用7位就夠了,不是8位哦。

那麼今天的8位Byte是怎麼來的呢?
這就要提到System/360了。在十九世紀60年代初期,IBM同時積極參與ASCII標準化,同時在System/360產品線中引入了八位擴展二進制編碼十進制交換碼(EBCDIC),這是對六位二進制編碼十進制(BCDIC)的擴展。IBM突出的表現,逐漸就讓8位Byte普及開來了。但是呢,這個EBCDIC和ASCII是不一樣的哦。
十九世紀70年代八位微處理器的發展普及了這種存儲容量。早期的計算機如Intel的8088、8086是可以通過4位訪問的哦,那時叫做半字節。
也許你用過8位單片機,但是你聽説過4位單片機嗎?哈哈!
5. 進制
我們最熟知的是十進制,從小接觸的數字和算術計算用的都是十進制。然後學到信息計算機相關知識了,就開始接觸或認識二進制。上面也提到了,陰陽八卦用的就是二進制。其實二進制普遍存於大自然中,也存在於生活中。
那麼除了十進制、二進制,還有哪些進制呢?八進制、十六進制等等。這些都是程序員熟悉的。
講了這麼多,什麼是進制?
進制就是進位計數制,是人為定義的帶進位的計數方法。十進制是逢十進一,二進制是逢二進一,十六進制是逢十六進一,那麼X進制就是逢X進一了。
進制在數字上怎麼表示?
也很簡單,進制小於10的,用阿拉伯數字就很容易表達出來。如:
十進制:0, 1, 2, 3, 4, 5, 6, 7, 8, 9,  10。這個10就是逢十進一變成兩位數了。
八進制: 0 , 1,  2,  3,  4,  5, 6,  7,  10這個10就是逢八進 一變成兩位數了,按數值計算,這個八進制的10相當於十進制的9,是表達形式變了
二進制:0, 1,  10這個10就是逢二進 一變成兩位數了
那麼進制大於10的呢,如十六進制怎麼表示?
十六進制: 0 , 1,  2,  3,  4,  5, 6,  7,  8 9, A, B, C, D, E, F, 10。 這個10就是逢十六進 一變成兩位數了。因為阿拉伯數字沒有單一數字表達的10, 11, 12, 13, 14, 15,所以採用A, B, C, D, E, F來表達,只是表達形式不一樣而已。
上面我們提到了個BCD碼,啥是BCD碼?十六進制又是什麼鬼?
十進制
二進制
八進制
十六進制
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
於是,可以約定,這些進制的表達方式,不然10到底是幾進制的表達的數字是多少都不知道。
二進制用B(Binary)來表達,如1001B,但是編程語言中最小的單位是Byte,所以沒有約定表達二進制的方法。
八進制用 O (Oct) 來表達,寫成123O?這個O和0寫法相近,會讓人誤解的,好睏惑哦。在編程語言中,通常在數字前面加個0,即0123表示八進制的123,注意跟十進制的123不相等哦。
十六進制用H(Hex)表示,如2BH,編程語言中用0x開頭來表示,如0x2B。
這裏為什麼提二進制、十進制、八進制和十六進制呢?十進制剛才説了,是最常見接觸最多的進制,而二進制是計算機的基本進制,但計算機通常以8 Bit的Byte來作為基本單位,那麼一個Byte的剛好可以表示16個數,所以,十六進制是非常常用的,而八進制就是對於半個Byte了。
好了,問題來了,除了這些常見了,有沒有三進制呢,十七進制呢?答案是有的,隨你喜歡,多少都行。
Python中有個 int的內置函數,可以轉換各種進制。以下看看100這個數在各個進制中對應的十進制數值是多少。
>>> 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 "", line 1, in <module>ValueError: int() base must be >= 2 and <= 36
這個內置函數 int只能算大於等於2並小於等於36進制的數。
6. BCD碼
上文提到了個BCD碼,這是什麼鬼?

BCD碼(Binary-Coded Decimal‎),用4位二進制數來表示1位十進制數中的0~9這10個數碼,是一種二進制的數字編碼形式,用二進制編碼的十進制代碼。

如果不懂這個概念,要認真讀幾次上面這段話。簡單地理解為,1位十進制數碼用4位二進制數來表示,但根據這1位十進制數碼和4位二進制數的對應關係(或者表達關係)不一樣而有不同的形式,如8421碼、2421碼、5421碼餘3碼、餘3循環碼、格雷碼,其中前面三種是有權碼,後面三種是無權碼

有權碼,自然二進制代碼是按照二進制代碼各位權值大小,以自然向下加一,逢二進一的方式來表示數值的大小所生成的代碼。 

顯然,n位自然二進制代碼共有2^n種狀態取值組合,由於代碼中各位的位權值分別為2^3,2^2,2^1,2^0,即8421,所以也稱為8421碼。這樣每位二進制碼元都有確定位權值的編碼,稱為有權碼,屬於恆權代碼。相應的,沒有確定位權值的編碼叫無權碼,也叫非恆權代碼。

百度百科——有權碼
8421碼
8421 BCD碼是最基本和最常用的BCD碼,0~9的8421碼與4位自然二進制形式完全一樣,即用0000~1001分別代表它所對應的十進制數。要計算一個多位的8421碼可以每位單獨拆分出來,並算出對應的二進制碼(不足四位前面補0),然後拼起來即可。舉個例子:
8421碼:235,拆分出來是2、3、5,分別對應二進制是0010、0011、1001,拼起來是0010 0011 1001。

5421和2421

5421 BCD碼和2421 BCD碼,這兩種有權BCD碼中,有的十進制數碼存在兩種加權方法,例如,5421 BCD碼中的數碼5,既可以用1000表示,也可以用0101表示;2421 BCD碼中的數碼6,既可以用1100表示, 也可以用0110表示。這説明5421 BCD碼和2421 BCD碼的編碼方案都不是惟一的。
下面列舉 8421碼、2421碼、5421碼和一位十進制數的對照關係。
十進制數 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循環碼
餘3碼實很簡單,是8421 BCD碼的每個碼組加3(0011)形成的。為什麼有餘3碼這個東西呢,實際上其常用於BCD碼的運算電路中。
餘3循環碼實際上是變權碼,每一位的1並不代表固定的數值,十進制數的餘3循環碼就是取4位格雷碼中的十個代碼組成。
那麼什麼是格雷碼?
格雷碼
格雷碼(Gray Code),其由很多曾用名,如格萊碼、戈萊碼、循環碼、反射二進制碼、最小差錯碼等。
格雷碼有很多種表現形式

為什麼要用格雷碼呢?

格雷碼是一種具有反射特性和循環特性的單步自補碼,其循環和單步特性消除了隨機取數時出現重大錯誤的可能,其反射和自補特性使得對其進行求反操作也非常方便,所以,格雷碼屬於一種可靠性編碼,是一種錯誤最小化的編碼方式,因此格雷碼在通信和測量技術中得到廣泛應用。 

格雷碼屬於可靠性編碼,是一種錯誤最小化的編碼方式。因為,雖然自然二進制碼可以直接由數/模轉換器轉換成模擬信號,但在某些情況,例如從十進制的3轉換為4時二進制碼的每一位都要變,能使數字電路產生很大的尖峯電流脈衝。

格雷碼Gray Code詳解(//www.cnblogs.com/zhuruibi/p/8988044.html)
怎麼計算格雷碼?
二進制碼→格雷碼(編碼):
此方法從對應的n位二進制碼字中直接得到n位格雷碼碼字,步驟如下:
  1. 對n位二進制的碼字,從右到左,以0到n-1編號
  2. 如果二進制碼字的第i位和i+1位相同,則對應的格雷碼的第i位為0,否則為1(當i+1=n時,二進制碼字的第n位被認為是0,即第n-1位不變)


-END-


來源 | 嵌入式軟件實戰派

作者 | 實戰派掌門


整理文章為傳播相關技術,版權歸原作者所有 |

如有侵權,請聯繫刪除 |


【全民集運】飛機上一般是什麼操作系統?

【全民集運】高速CAN、容錯CAN、LIN總線有什麼區別?

【全民集運】鴻蒙和安卓,到底有什麼區別?

【全民集運】大佬終於把鴻蒙OS講明白了,收藏了!

【全民集運】必看!影響嵌入式薪資的各種原因!



免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

換一批

延伸閲讀

[嵌入式大雜燴] 分享一份不錯的嵌入式編碼規範,值得收藏細讀!

原文://blog.csdn.net/qq_33499229/article/details/88677757 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作...

關鍵字: 嵌入式 編碼 規範

[strongerHuang] 深度掌握bin、hex、axf和elf文件格式

作者 | strongerHuang 微信公眾號 | 嵌入式專欄 在嵌入式軟件開發中,bin、hex、axf和elf這四種格式的文件很常見。 之前我...

關鍵字: 文件格式 bin 嵌入式

[架構師社區] 圖解計算機中數據的表示形式

//github.com/sunshinelyz/mykit-delay PS: 歡迎各位Star源碼,也可以pr你牛逼哄哄的代碼。...

關鍵字: 數據 計算機 表示形式

[嵌入式案例Show] STM32 時鐘分析

01 前言 在嵌入式系統中時鐘是其脈搏,處理器內核在時鐘驅動下完成指令執行,狀態變換等動作。外設部件在時鐘的驅動下完成各種工作,比如串口數據的發送、A/D轉換、定時器計數等等。...

關鍵字: 時鐘 STM32 嵌入式

[嵌入式ARM] 盤點STM32的國產替代者(4)

應讀者要求,嵌入式ARM將繼續介紹能夠替代STM32的國產產品。 MM32是一個全球化的MCU產品,靈動微在上海設立芯片設計及運營中心,藉助上海晶圓代工、封裝測試完整產業鏈,確保靈動MCU從研發到生...

關鍵字: 國產 STM32 嵌入式

技術子站

關閉