指令通常都是由兩部分組成:操做碼和操做地址。編碼
在計算機大量的指令當中有着「二·八」定則,指的是有着20%的指令在80%的時間裏重複使用着,而80%的指令只有20%的時間在使用着。spa
那麼爲了提升計算機的工做效率,在指令的調用上,要想辦法把那20%的指令儘量的放在近的地方,而那剩下的指令能夠放在稍微遠一些的地方,所以,赫夫曼編碼出現了。blog
赫夫曼(Huffman)編碼的基本思想:當各類事件發生的機率不均等時,可對發生機率高的事件用最短的位數(時間)來表示,而對於出現機率比較短的事件,則能夠用較長的位數(時間)來表示,從而使總的平均位數(時間)縮短。排序
下面介紹一下關於赫夫曼編碼的方法。事件
首先要先了解到赫夫曼編碼是從下往上的方法構建二叉樹。爾其本質就是排序的一種。ci
當一串數列放在眼前,就須要對其排列,規則爲:永遠是數列裏面兩個最小的加在一塊兒後往上走,且兩數相加後如遇到等值數列,則放在其右邊。在赫夫曼樹中永遠是小的放在左邊而大的放在右邊,路徑爲左零右一。get
由一道例題來解釋說明it
【例題】某臺處理機的各條指令使用頻度以下表table
指令效率 |
使用頻度 |
指令 |
使用頻度 |
指令 |
使用頻度 |
ADD |
43% |
JOM |
6% |
CIL |
2% |
SUB |
13% |
STO |
5% |
CLA |
22% |
JMP |
7% |
SHR |
1% |
STP |
1% |
如今對這個頻度表進行赫夫曼編碼
先對指令和使用頻度進行排序
從小到大爲:SHR 1% STP 1% CIL 2% STO 5% JOM 6% JMP 7% SUB 13% CLA 22% ADD 43%
先進行第一次排序,最小的兩個先相加
如今的排序是 CIL 2% < 2% < STO 5% < JOM 6% < JMP 7% < SUB 13% < CLA 22% < ADD 43%
加起來的值放在等值的右邊
如今的排列是 4% < STO 5% < JOM 6% < JMP 7% < SUB 13% < CLA 22% < ADD 43%
如今的排序是 JOM 6% < JMP 7% < 9% < SUB 13% < CLA 22% < ADD 43%
如今的排序是 9% < SUB 13% < 13% < CLA 22% < ADD 43%
如今的排序是 22% < 35% < ADD 43%
最終的結果爲
編碼爲 SHR 100010 STP 100011 CIL 10000 STO 1001 JOM 1100 JMP 1101 SUB 101 CIA 111 ADD 0
平均碼長 = 位長 * 使用頻度
在早期的計算機上,爲了便於分級譯碼,通常採用等長擴展碼。常見的擴展碼有15/15/15或8/64/512。
選用哪一種編碼方法取決於指令使用頻度的分部。若在頭15指令中值比較大,但在後30中指令中急劇減小,則應該選擇15/15/15;若值的頭8種指令中較大,以後64中指令也不過低,則使用8/64/512。
爲了方便理解,根據上面那道例題進行練習
因爲上面例題編碼不長,不用使用15/15/15
咱們使用3/3/3和2/7來討論
3/3/3編碼:
頻度最高的放在前面:
ADD 00 CIA 01 SUB 10 JMP 11 00 JOM 11 01 STO 11 10 CIL 11 11 00 STP 11 11 01 SHR 11 11 10
2/7編碼:
ADD 0 0 CIA 0 1 SUB 1 000 JMP 1 001 JOM 1 010 STO 1 011 CIL 1 100 STP 1 101 SHR 1 110
隨着計算機存儲空間的日益增大,爲保證速度和下降譯碼複雜度,現不少計算機都採用了固定長度的操做碼,全部指令操做碼都是同一長度,這就是空間換時間的概念。
以上,不足之處請多多指正。