本文目錄一覽:
什麼是海明碼呀?通俗一點,但又能深刻一點!謝謝了!!!
海明碼其實也不難,相對於寄偶檢驗碼 它不僅可以檢驗出錯誤,還能修正錯誤!但只能是檢驗、修正一位錯誤!說一大堆理論是沒什麼意思,下面將通過一個例子,儘可能的用最通俗易懂的方式進行講解!最後大家會發現海明碼很神奇!!
假設要傳送的數據為:1011 0011
校驗流程如下:
一:確定校驗位並插入到有效數據位中。
相比奇偶校驗只插入一個檢驗碼,海明碼需要插入多個檢驗碼,插入的位數與有效數據位數相關,公式如下
公式:2^r-rk+1,其中r就是要插入檢驗碼的個數,取滿足條件的最小整數,k是有效數據位數。因為我們要傳送的數據是:1011 0011,顯然k=8,推出r=4。也就說我們要將4個校驗位插入到有效數據中,怎麼插入呢?按照如下規則:
插入位置固定為2^N(N:0,1,2,3,4,5……)處,因為r=4,即只需要取4個有{2^0,2^1,2^2,2^3},對應位置即是1,2,4,8,當然了,如果r=5,那麼插入位置為:1,2,4,8,16.同類可以推出其他情況,不再啰嗦。(之所以選擇這樣的位置插入,是為了有效的分組,保證後面的校驗分組能有效的錯開,不會互相干擾,這句話不需要理解,到後面就能體會!)
通過分析得到待傳送的數據為:xx1x 011x 0011,4位校驗位+8為有效數據位。
二、確定校驗位的數值。
顯然X只能取0,1,下面確定x的值:
由一可知待傳送數據為:xx1x 011x 0011。
規則:以X的位置為長度,依次從待傳送數據中取X個數,然後跳過X個數,再取X個數,直到待傳送數據串尾,得到一個子串,然後統計子串中1的個數,如果為奇數,則x=0,為偶數,x=1(當然,反過來也行,其實這就是奇偶校驗的規則,想了解奇偶校驗可以參見我以前的回答的,這裡不了解也行)
第1個X:位置為1,從第1個位置開始依次取1個數據,並跳過1個數據再取,直到串尾得到一個子串:
{x 1 0 1 0 1},這個串可記為第1個校驗組, 因為1的個數是3個為奇數,故x=0.
第2個X:位置為2,故從第2個位置開始依次取2個數據,並跳過2個數據再取,直到串尾得到一個子串:
{x1 11 01} ,記為第2個校驗組,因為1的個數為4是偶數,故x=1.
第3個X:位置是4,故從第4個位置開始依次取4個數據,並跳過4個數據再取,直到串尾得到一個子串:
{x011 1},記為第3個校驗組,因為1的個數為3是奇數,故x=0.
第4個X:位置是8,故從第8個位置開始依次取8個數據,並跳過8個數據再取,直到串尾得到一個子串:
{x0011 },記為第4個校驗組,……,X=1。
故得到最終的待傳送的數據串為:0110 0111 0011。
這裡其實就可以看到了,為什麼X的位置要取2^N,這樣才能保證各個校驗位不會相互干擾。
經過以上一、二步驟就完整了海明碼的構造過程,下面講解校驗過程:
三、根據步驟二中的構造規則,取出各校驗組
發送的數據串為:0110 0111 0011。
假設接受到的數據串為:0110 0111 1011(注意和傳送數據串相比,第9為出現了錯誤!)
規則:以X的位置為長度,依次從待傳送數據中取X個數,然後跳過X個數,再取X個數,直到待傳送數據串尾,得到一個子串,然後統計子串中1的個數,如果為奇數,則x=0,為偶數,x=1(規則必須和步驟二中一樣)
根據二中制定的規則再次取出各個校驗組。
第1個校驗組:從第1個位置開始依次取1個數據,並跳過1個數據再取,直到串尾得到一個子串:{0 1 0 1 1 1}。
第2個校驗組:從第2個位置開始依次取2個數據,並跳過2個數據再取,直到串尾得到一個子串:{11 11 01}
第3個校驗組:從第4個位置開始依次取4個數據,並跳過4個數據再取,直到串尾得到一個子串:{0011 1}
第4個校驗組:從第8個位置開始依次取8個數據,並跳過8個數據再取,直到串尾得到一個子串:{11011}.
四、根據步驟二的構造規則,確定存在錯誤的校驗組,並通過錯誤校驗組的交集,最終確定出錯的位置。
由步驟三得到4個校驗組:
1:{0 1 0 1 1 1}。 對應位置為{1 3 5 7 9 11}
2:{11 11 01}。 對應位置為{2 3 6 7 10 11}
3:{0011 1} 。對應位置為{4567 12}
4:{11011}。 對應位置為{8 9 10 11 12}
因為我們的構造規則是:統計子串中1的個數,如果為奇數,則x=0,為偶數,x=1。
所以正確的校驗組中1的個數絕對是奇數!(好好琢磨,很容易就想通了,如果我們的規則是為奇數,則x=1,為偶數,x=0。那麼正確的校驗組中1的個數絕對是偶數),所以如果校驗組1的個數不是奇數,那麼這個校驗組就存在問題。因而可以判斷第1個和第4個校驗組出現問題了。
確定了第1個和第4個校驗組出現問題後,找到這兩個校驗組的交集即第9個位置和第11個位置是它們交集,即共同校驗的位置。於是判斷出現問題的位置要麼就是第9個位置,要麼就是第11個位置!因為在第2個校驗組中有第11個位置,故第11個位置絕對沒有出錯,因為就可以判斷是第9個位置出現錯誤!
到這裡,應該懂了吧?但是不是覺得找出錯位置有點麻煩啊?下面就給出一個具體的實現方法,理解了上面的描述,再了解下面實現的方法,立馬就能確定出錯誤的位置:
首先:我們對各個校驗組求異或。
第一個校驗組:{0 1 0 1 1 1} 異或的結果為:0
第二個校驗組:{11 11 01}異或的結果為:1
第三個校驗組:{0011 1} 異或的結果為:1
第四個校驗組:{11011}異或的結果為:0
接着:倒置拼接異或結果,得到:0110,
最後:按位取反的到:1001,。
大家有沒有驚奇的發現1001的十進制數就是9,這不就是出錯的位置嗎?這是巧合嗎?
不急再看一個例子:
傳送的數據串為: 0110 0111 0011(還是我們開始的那個串)
接受到的數據串為:0110 1111 0011(和正確數據串相比,第5個位置出錯了)
第一個校驗組:{0 1 1 1 0 1} 異或的結果為:0
第二個校驗組:{11 11 01}異或的結果為:1
第三個校驗組:{0111 1} 異或的結果為:0
第四個校驗組:{10011}異或的結果為:1
倒置拼接:1010 反轉為:0101 對應十進制數為5!
也就是說方法是真確的!!不用懷疑!!這也就是海明碼的奇妙之處!
再來看看一個例子:
傳送的數據串為: 0110 0111 0011(還是我們開始的那個串)
接受到的數據串為:0110 0110 0011(和正確數據串相比,第8個位置校驗位出錯了)
顯然這是校驗位出錯了,那麼能不能校驗出來呢?
第一個校驗組:{0 1 0 1 0 1} 異或的結果為:1
第二個校驗組:{11 11 01}異或的結果為:1
第三個校驗組:{0011 1} 異或的結果為:1
第四個校驗組:{00011}異或的結果為:0
倒置反轉結果為1000 正好是8,所以也沒問題。
下面我們來說下規則:(其實就是說異或與奇偶的關係,想拓展的就可以看看)
上面的例子中,我們規定: 統計子串中1的個數,如果為奇數,則x=0,為偶數,x=1。如果是按這樣的規定,那麼校驗組中1的個數必定是奇數,正是因為如此,所以校驗組中如果1的個數不是奇數那麼肯定出現了錯誤!而如果一個串中1的個數是奇數,那麼串異或的結果一定為1,其實這個規則對應的就是奇校驗!反之,如果為奇數,則x=1,為偶數,x=0,那麼對應的就是偶校驗!
故得到以下結論:
如果採用奇檢驗構造海明碼,那麼出錯校驗組中的1的個數必為偶數,即異或的結果必定為0!
如果採用奇檢驗構造海明碼,那麼出錯的位置是校驗組異或結果倒置拼接並反轉的十進制數
如果採用偶檢驗構造海明碼,那麼出錯校驗組中的1的個數必為奇數,即異或的結果必定為1!
如果採用偶檢驗構造海明碼,那麼出錯位置是校驗組異或結果直接倒置拼接的十進制數!
關於偶檢驗構造海明碼這裡就不再詳細展開,如果你能用偶檢驗的方法在把上面的例子都做一遍,那麼海明碼你就已經完全弄懂了!試試吧!
關於奇偶檢驗碼 建議還是看看,因為海明碼是基於奇偶校驗的改進!而且奇偶校驗更簡單!
海明校驗碼的內容以及格式?
你好、海明校驗碼由Richard Hamming於1950年提出、目前還被廣泛採用的一種很有效的校驗方法,是只要增加少數幾個校驗位,就能檢測出二位同時出錯、亦能檢測出一位出錯並能自動恢復該出錯位的正確值的有效手段,後者被稱為自動糾錯。它的實現原理,是在k個數據位之外加上r個校驗位,從而形成一個k+r位的新的碼字,使新的碼字的碼距比較均勻地拉大。把數據的每一個二進制位分配在幾個不同的偶校驗位的組合中,當某一位出錯後,就會引起相關的幾個校驗位的值發生變化,這不但可以發現出錯,還能指出是哪一位出錯,為進一步自動糾錯提供了依據。
假設為k個數據位設置r個校驗位,則校驗位能表示2r個狀態,可用其中的一個狀態指出 “沒有發生錯誤”,用其餘的2 r -1個狀態指出有錯誤發生在某一位,包括k個數據位和r個校驗位,因此校驗位的位數應滿足如下關係:
2r ≥ k + r + 1 (2.7)
如要能檢出與自動校正一位錯,並能同時發現兩位錯,此時校驗位的位數r和數據位的位數k應滿足下述關係:
2r-1 ≥ k + r (2.8)
按上述不等式,可計算出數據位k與校驗位r的對應關係,如表2.2所示。
表2.2
K值 最小的r值
3-4 4
5-10 5
11-25 6
26-56 7
57-119 8
設計海明碼編碼的關鍵技術,是合理地把每個數據位分配到r個校驗組中,以確保能發現碼字中任何一位出錯;若要實現糾錯,還要求能指出是哪一位出錯,對出錯位求反則得到該位的正確值。例如,當數據位為3位(用D3 D2 D1表示)時,檢驗位應為4位(用P4 P3 P2 P1表示)。可通過表2.3表示的關係,完成把每個數據位劃分在形成不同校驗位的偶校驗值的邏輯表達式中。
表2.3 校驗位與數據位的對應關係
在P1、P2、P3、P4豎列相應行分別填1,
在該4列的低3橫行其它位置分別填0,
在最頂橫行的每個尚空位置都分別填1。
若只看低3橫行,右4豎列的3個bit的組合值分別為十進制的1、2、4、0,則分配 D1 D2 D3列的組合值為3 5 6,保證低3橫行各豎列的編碼值各不相同。
表中D3 D2 D1為三位數據位,P4 P3 P2 P1為四位校驗位。其中低三位中的每一個校驗位P3 P2 P1的值,都是用三個數據位中不同的幾位通過偶校驗運算規則計算出來的。其對應關係是:對Pi(i的取值為1~3),總是用處在Pi取值為1的行中的、用1標記出來的數據位計算該Pi的值。最高一個校驗位P4,被稱為總校驗位,它的值,是通過對全部三個數據位和其它全部校驗位(不含P4本身)執行偶校驗計算求得的。
形成各校驗位的值的過程叫做編碼,按剛說明的規則,4個校驗位所用的編碼方程為:
P4 = D3 D2 D1 P3 P2 P1
P3 = D3 D2
P2 = D3 D1
P1 = D2 D1
由多個數據位和多個校驗位組成的一個碼字,將作為一個數據單位處理,例如被寫入內存或被傳送走。之後,在執行內存讀操作或在數據接收端,則可以對得到的碼字,通過偶校驗來檢查其合法性,通常稱該操作過程為譯碼,所用的譯碼方程為:
S4 = P4 D3 D2 D1 P3 P2 P1
S3 = P3 D3 D2
S2 = P2 D3 D1
S1 = P1 D2 D1
譯碼方程和編碼方程的對應關係很簡單。譯碼方程,是用一個校驗碼和形成這個校驗碼的編碼方程執行異或,實際上是又一次執行偶校驗運算。通過檢查四個S的結果,可以實現檢錯糾錯的的目的。實際情況是,當譯碼求出來的S4、S3、S2、S1的得值與表2.3中的那一列的值相同,就說明是哪一位出錯;故人們又稱表2.3為出錯模式表。若出錯的是數據位,對其求反則實現糾錯;若出錯的是校驗位則不必理睬。舉例如下:
任何一位(含數據位、校驗位)均不錯,則四個S都應為0值;
任何單獨一位數據位出錯,四個S中會有三個為1;如D3錯,則S4 S3 S2 S1為1110。
若單獨一位校驗位出錯,四個S中會有一個或兩個為1;如P1錯,S4 S3 S2 S1為1001,如P4錯,S4 S3 S2 S1為1000。
任何兩位(含數據位、校驗位)同時出錯,S4一定為0,而另外三個S位一定不全為0,此時只知道是兩位同時出錯,但不能確定是哪兩位出錯,故已無法糾錯。如D1、 P2出錯,會使S4 S3 S2 S1為0001。請注意,S4的作用在於區分是奇數位出錯還是偶數位出錯,S4為1是奇數位錯,為0是無錯或偶數位錯。這不僅為發現兩位錯所必需,也是為確保能發現並改正一位錯所必需的。若不設置S4,某種兩位出錯對幾個S的影響與單獨另一位出錯可能是一樣的(不必花費精力推敲),此時若不加以區分,簡單地按一位出錯自動完成糾錯處理反而會幫倒忙。
海明碼的原理
海明碼是一種可以糾正一位差錯的編碼。它是利用在信息位為k位,增加r位冗餘位,構成一個n=k+r位的碼字,然後用r個監督關係式產生的r個校正因子來區分無錯和在碼字中的n個不同位置的一位錯。它必需滿足以下關係式: r 2^r ≥ k r 1 或 2^r ≥ n 1海明碼的編碼效率為: R=k/(k+r) 式中 k為信息位位數 r為增加冗餘位位數
目錄
1.海明碼的原理
2.海明碼的生成與接收
3.海明碼的計算
4.海明碼校驗程序設計原理分析參考
編輯本段1.海明碼的原理
在數據中間加入幾個校驗碼,碼距均勻拉大,將數據的每個二進制位分配在幾個奇偶校驗組裡,當某一位出錯,會引起幾個校驗位的值發生變化。
海明不等式:
校驗碼個數為K,2的K次方個信息,1個信息用來指出“沒有錯誤”,其餘(2^K)-1個指出錯誤發生在那一位,但也可能是校驗位錯誤,故有N=(2^K)-1-K能被校驗。
海明碼的編碼規則:
1.每個校驗位Ri被分配在海明碼的第2的i次方的位置上,
2.海明碼的每一位(Hi)是由多個/1個校驗值進行校驗的,被校驗碼的
位置碼是所有校驗位的校驗位位置碼之和。
一個例題:
4個數據位d0,d1,d2,d3, 3個校驗位r0,r1,r2,對應的位置為:
d3 d2 d1 r2 d0 r1 r0 ======b7 b6 b5 b4 b3 b2 b1
校驗位的取值,就是他所能校驗的數據位的異或
b1為b3,b5,b7的異或,b2為b3,b6,b7 b4為b5,b6,b7
海明v傳送到接受方後,將上三式的右邊(b1,b2,b4)的邏輯表達式分別
異或上左邊的值就得到了校驗方程,如果上題採用偶校驗
G1=b1 b3 b5 b7的異或
G2=b2 b3 b6 b7的異或
G3=b4 b5 b6 b7的異或
若G1G2G3為001是第一位錯
若為011是第三位錯
編輯本段2.海明碼的生成與接收
特註:以下的+均代表異或
方法一:
1)海明碼的生成。
例1.已知:信息碼為:”0010″。海明碼的監督關係式為:
S2=a2+a4+a5+a6
S1=a1+a3+a5+a6
S0=a0+a3+a4+a6
求:海明碼碼字。
解:1)由監督關係式知冗餘碼為a2a1a0。
2)冗餘碼與信息碼合成的海明碼是:”0010a2a1a0″。
設S2=S1=S0=0,由監督關係式得:
異或運算:
a2=a4+a5+a6=1
a1=a3+a5+a6=0
a0=a3+a4+a6=1
因此,海明碼碼字為:”0010101″
對以上這道題目的第二問的疑問:
冗餘碼與信息碼合成的海明碼是:”0010a2a1a0″。為什麼a2a1a0直接加在信息碼後面,而不是按照1,2,4,8位的順序加在信息碼後面【例如:001(a2)0(a1)(a0)=0011001】
2)海明碼的接收。
例2.已知:海明碼的監督關係式為:
S2=a2+a4+a5+a6
S1=a1+a3+a5+a6
S0=a0+a3+a4+a6
接收碼字為:”0011101″(n=7)
求:發送端的信息碼。
解:1)由海明碼的監督關係式計算得S2S1S0=011。
2)由監督關係式可構造出下面錯碼位置關係表:
S2S1S0
000
001
010
100
011
101
110
111
錯碼位置
無錯
a0
a1
a2
a3
a4
a5
a6
3)由S2S1S0=011查表得知錯碼位置是a3。
4)糾錯–對碼字的a3位取反得正確碼字:”0 0 1 0 1 0 1″
5)把冗餘碼a2a1a0刪除得發送端的信息碼:”0010″
方法二:(不用查表,方便編程)
1)海明碼的生成(順序生成法)。
例3.已知:信息碼為:” 1 1 0 0 1 1 0 0 ” (k=4代表冗餘位數,即校驗碼位數)
求:海明碼碼字。
解:1)把冗餘碼A、B、C、…,順序插入信息碼中,得海明碼
碼字:” A B 1 C 1 0 0 D 1 1 0 0 “
碼位: 1 2 3 4 5 6 7 8 9 10 11 12
其中A,B,C,D分別插於2的k次方位(k=0,1,2,3)。碼位分別為1,2,4,8。
2)冗餘碼A,B,C,D的線性碼位是:(相當於監督關係式)
監督關係式的推導:
D C B A
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1
12 1 1 0 0
根據上面表格得到 A B C D
需要說明的是公式中參與計算的是表格中出現”1″的那個位 右邊是數據位的二進制數,公式中的”+”表示異或
故此有如下表達式:
A-1,3,5,7,9,11;(這裡的1 3 5 7 9 11均為A那一列出現1的位)
B-2,3,6,7,10,11;
C-4,5,6,7,12;(注 5=4+1;6=4+2;7=4+2+1;12=8+4)
D-8,9,10,11,12。
3)把線性碼位的值的偶校驗作為冗餘碼的值(設冗餘碼初值為0):
A=∑(0,1,1,0,1,0)=1
B=∑(0,1,0,0,1,0)=0
C=∑(0,1,0,0,0) =1
D=∑(0,1,1,0,0) =0
4)海明碼為:”1 0 1 1 1 0 0 0 1 1 0 0″
2)海明碼的接收。
例4.已知:接收的碼字為:”1 0 0 1 1 0 0 0 1 1 0 0″(k=4代表冗餘位數,即校驗碼位數)
求:發送端的信息碼。
解:1)設錯誤累加器(err)初值=0
2)求出冗餘碼的偶校驗和,並按碼位累加到err中:
A=∑(1,0,1,0,1,0)=1 err=err+2^0=1
B=∑(0,0,0,0,1,0)=1 err=err+2^1=3
C=∑(1,1,0,0,0) =0 err=err+0 =3
D=∑(0,1,1,0,0) =0 err=err+0 =3
由err≠0可知接收碼字有錯,
3)碼字的錯誤位置就是錯誤累加器(err)的值3。
4)糾錯–對碼字的第3位值取反得正確碼字:
“1 0 1 1 1 0 0 0 1 1 0 0”
5)把位於2的k次方位的冗餘碼刪除得信息碼:”1 1 0 0 1 1 0 0″
編輯本段3.海明碼的計算
海明碼(Hamming Code )編碼的關鍵是使用多餘的奇偶校驗位來識別一位錯誤。
碼字(Code Word) 按如下方法構建:
1、把所有2的冪次方的數據位標記為奇偶校驗位(編號為1, 2, 4, 8, 16, 32, 64等的位置)
2、其他數據位用於待編碼數據. (編號為3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17等的位置)
3、每個奇偶校驗位的值代表了代碼字中部分數據位的奇偶性,其所在位置決定了要校驗和跳過的比特位順序。
位置1:校驗1位,跳過1位,校驗1位,跳過1位(1,3,5,7,9,11,13,15,…)
位置2:校驗2位,跳過2位,校驗2位,跳過2位 (2,3,6,7,10,11,14,15,…)
位置4:校驗4位,跳過4位,校驗4位,跳過4位 (4,5,6,7,12,13,14,15,20,21,22,23,…)
位置8:校驗8位,跳過8位,校驗8位,跳過8位(8-15,24-31,40-47,…)
…
如果全部校驗的位置中有奇數個1,把該奇偶校驗位置為1;如果全部校驗的位置中有偶數個1,把該奇偶校驗位置為0.
舉例說明:
一個字節的數據:10011010
構造數據字(Data Word),對應的校驗位留空_ _ 1 _ 0 0 1 _ 1 0 1 0
計算每個校驗位的奇偶性 ( ?代表要設置的比特位):
位置1檢查1,3,5,7,9,11:
? _ 1 _ 0 0 1 _ 1 0 1 0. 偶數個1,因此位置1設為0,即: 0 _ 1 _ 0 0 1 _ 1 0 1 0
位置2檢查2,3,6,7,10,11:
0 ? 1 _ 0 0 1 _ 1 0 1 0. 奇數個1,因此位置2設為1,即: 0 1 1 _ 0 0 1 _ 1 0 1 0
位置4檢查4,5,6,7,12:
0 1 1 ? 0 0 1 _ 1 0 1 0. 奇數個1,因此位置4設為1,即: 0 1 1 1 0 0 1 _ 1 0 1 0
位置8檢查8,9,10,11,12:
0 1 1 1 0 0 1 ? 1 0 1 0. 偶數個1,因此位置8設為0,即: 0 1 1 1 0 0 1 0 1 0 1 0
因此碼字為: 011100101010.
查找並糾錯一位錯誤
上例中構建了一個碼字 011100101010,假定實際接收到的數據是011100101110. 則接收方可以計算出哪一位出錯並對其進行更正。方法就是驗證每一個校驗位。記下所有出錯的校驗位,可以發現校驗位2和8的數據不正確. 錯誤校驗位 2 + 8 = 10, 則位置10的數據出錯。一般說來,對所有校驗位進行檢查, 將所有出錯的校驗位置相加, 得到的就是錯誤信息所在的位置.
編輯本段4.海明碼校驗程序設計原理分析參考
海明碼校驗是為了保證數據傳輸正確而提出的,本來就是一串要傳送的數據,如:D7,D6,D5,D4,D3,D2,D1,D0,這裡舉的是八位數據,可以是n位數據。就這樣傳送數據,不知道接收到後是不是正確的。所以,要加入校驗位數據才能檢查是否出錯。這裡涉及到一個問題,要多少位校驗數據才能查出錯誤呢?
我們只要能檢測出一位出錯,則對於8位信息數據,校驗位為4位。滿足下列條件:2的k次方大於等於n+k+1,其中k為校驗位位數,n為信息數據位位數。驗證一下,2的4次方等於16,n+k+1等於8+4+1等於13。 8位信息數據與4位校驗位總共有12位數據,怎麼排列呢?我們先把校驗位按P4,P3,P2,P1排列,用通式Pi表示校驗位序列,i為校驗位在校驗序列中的位置。 傳送的數據流用M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1表示,接下來的問題是如何用D7,D6,D5,D4,D3,D2,D1,D0與P4,P3,P2,P1來表M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1了。校驗位在傳送的數據流中位置為2的i-1次方,則P1在M1位,P2在M2位,P3在M4位,P4在M8位。其餘的用信息數據從高到低插入。 傳送的數據流為D7,D6,D5,D4,P4,D3,D2,D1,P3,D0,P2,P1。 接下來,我們要弄明白如何找出錯誤位的問題。引進4位校驗和序列S4,S3,S2,S1。S4,S3,S2,S1等於0,0,0,0表示傳送的數據流正確;如S4,S3,S2,S1等於0,0,1,0則表示傳送的數據流中第2位出錯;如S4,S3,S2,S1等於0,0,1,1則表示傳送的數據流中第3位出錯;依次類推。
用M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1如何表示S4,S3,S2,S1呢,簡單的方法就是S1=1時,S4,S3,S2從0,0,0到1,1,1的所有的Mx異或。即S1等於M1異或M3異或M5異或M7異或M9異或M11。也就是S1等於P1異或D0異或D1異或D3異或D4異或D6。S2=1時,S4,S3,S1從0,0,0到1,1,1的所有的Mx異或。即S2等於M2異或M3異或M6異或M7異或M10異或M11。S3=1時,S4,S2,S1從0,0,0到1,1,1的所有的Mx異或。即S3等於M4異或M5異或M6異或M7異或M12。S4=1時,S3,S2,S1從0,0,0到1,1,1的所有的Mx異或。即S4等於M8異或M9異或M10異或M11異或M12。這樣,對於一串碼流,知道幾位校驗位,可以很快確定哪一位出錯。而在發送端,可以根據S4,S3,S2,S1的表達式求出P4,P3,P2,P1的表達式,只要把式子右邊的P4或P3或P2或P1移到左邊替換掉S4或S3或S2或S1就可以了。面舉例說明:用^表示異或
D7,D6,D5,D4,D3,D2,D1,D0=11010001
S4=M8^M9^M10^M11^M12=D7^D6^D5^D4^P4; P4=D7^D6^D5^D4;
S3=M4^M5^M6^M7^M12 =D7^D3^D2^D1^P3; P3=D7^D3^D2^D1;
S2=M2^M3^M6^M7^M10^M11 =D6^D5^D3^D2^D0^P2; P2=D6^D5^D3^D2^D0;
S1=M1^M3^M5^M7^M9^M11=D6^D4^D3^D1^D0^P1; P1=D6^D4^D3^D1^D0;
所以,
P4=D7^D6^D5^D4=1^1^0^1=1
P3=D7^D3^D2^D1=1^0^0^0=1
P2= D6^D5^D3^D2^D0=1^0^0^0^1=0 P1=D6^D4^D3^D1^D0=1^1^0^0^1=1
故,傳送碼流為D7,D6,D5,D4,P4,D3,D2,D1,P3,D0,P2,P1等於
110110001101
若接收端收到110110001101,則
S4=M8^M9^M10^M11^M12=1^1^0^1^1=0
S3=M4^M5^M6^M7^M12=1^0^0^0^1=0
S2=M2^M3^M6^M7^M10^M11=0^1^0^0^0^1=0
S1=M1^M3^M5^M7^M9^M11=1^1^0^0^1^1=0
故,接收碼流正確。
若M6出錯,由0變為1。則
S4=M8^M9^M10^M11^M12=1^1^0^1^1=0
S3=M4^M5^M6^M7^M12=1^0^1^0^1=1
S2=M2^M3^M6^M7^M10^M11=0^1^1^0^0^1=1 S1=M1^M3^M5^M7^M9^M11=1^1^0^0^1^1=0
即S4S3S2S1=0110,此為十進制的6,說明第六位出錯,也就是M6出錯。完全符合。
5.海明碼的表格計算
如果對於m位的數據,增加k位冗餘位,則組成位n=m+k位的糾錯碼。對於2^m個有效碼字中的每一個,都有n個無效但可以糾錯的碼字。這些可糾錯的碼字與有效碼字的距離是1,含單個錯誤位。這樣,對於一個有效的消息總共有n+1個可識別的碼字。這n+1個碼字相對於其他2^m-1個有效消息的距離都大於1。這意味着總共有2^m(n+1)個有效的或是可糾錯的碼字。顯然這個數應小於等於碼字的所有的可能的個數2^n。於是我們有
2^m(n+1)2^n
因為n=m+k,我們得出
m+k+12^k
對於給定的數據位m,上式給出了k的下界,即要糾正單個錯誤,k必須取最小的值。海明建議了一種方案,可以達到這個下界,並能直接指出錯在哪一位。首先把碼字的位從1到n編號,,並把這個編號表示成二進制數,即2的冪之和。然後對2的每一個冪設置一個奇偶位。例如對於6號位,由於6=110(二進制),所以6號位參加第2位和第4位的奇偶校驗,而不參加第1位奇偶校驗。類似的9號位參加第1位和第8位的奇偶校驗而不參加第2位和第4位的奇偶校驗。海明把奇偶校驗分配在1,2,4,8等位置上,其他位置放數據。下面根據海明編碼的例圖,舉例說明編碼的方法
海明編碼的例
海明編碼的例
例如傳送的消息為:1001011
我們把數據放在3,5,6,7,9,10,11等位置上,1,2,4,8則為校驗位。
1
0 0 1
0 1 1
1 2 3 4 5 6 7 8 9 10 11
根據海明編碼的例,3、5、7、9、11的二進制編碼的第一位為1,所以3、5、7、9、11號位參加第一位校驗位,若按偶校驗計算,1號位應為1
1
1
0 0 1
0 1 1
1 2 3 4 5 6 7 8 9 10 11
類似的,3、6、7、10、11號位參加2號位校驗,5、6、7號位參加4號位校驗,9、10、11號位參加8號位校驗,全部按偶校驗計算,最終得到如下結果
1 0 1 1 0 0 1 0 0 1 1
1 2 3 4 5 6 7 8 9 10 11
如果這個碼字傳輸中有錯誤,比如說6號位出錯。就會變成
√ ╳ ╳ √
1 0 1 1 0 1 1 0 0 1 1
1 2 3 4 5 6 7 8 9 10 11
當接收端按照同樣的規則計算奇偶位時,就會發現1號位和8號位的奇偶性正確而2號位和4號位的奇偶性不對,於是2+4=6,,立即可以判斷錯在6號位。
上例中k=4,因而m2^4-4-1=11,即數據位可以用到11位,共組成15位的碼字,可檢測出單個位置的錯誤。
海明校驗碼的原理是什麼?
海明校驗碼
這是由Richard Hamming於1950年提出、目前還被廣泛採用的一種很有效的校驗方法,是只要增加少數幾個校驗位,就能檢測出二位同時出錯、亦能檢測出一位出錯並能自動恢復該出錯位的正確值的有效手段,後者被稱為自動糾錯。它的實現原理,是在k個數據位之外加上r個校驗位,從而形成一個k+r位的新的碼字,使新的碼字的碼距比較均勻地拉大。把數據的每一個二進制位分配在幾個不同的偶校驗位的組合中,當某一位出錯後,就會引起相關的幾個校驗位的值發生變化,這不但可以發現出錯,還能指出是哪一位出錯,為進一步自動糾錯提供了依據。
假設為k個數據位設置r個校驗位,則校驗位能表示2r個狀態,可用其中的一個狀態指出 “沒有發生錯誤”,用其餘的2 r -1個狀態指出有錯誤發生在某一位,包括k個數據位和r個校驗位,因此校驗位的位數應滿足如下關係:
2r ≥ k + r + 1 (2.7)
如要能檢出與自動校正一位錯,並能同時發現兩位錯,此時校驗位的位數r和數據位的位數k應滿足下述關係:
2r-1 ≥ k + r (2.8)
按上述不等式,可計算出數據位k與校驗位r的對應關係,如表2.2所示。
表2.2
K值 最小的r值
3-4 4
5-10 5
11-25 6
26-56 7
57-119 8
設計海明碼編碼的關鍵技術,是合理地把每個數據位分配到r個校驗組中,以確保能發現碼字中任何一位出錯;若要實現糾錯,還要求能指出是哪一位出錯,對出錯位求反則得到該位的正確值。例如,當數據位為3位(用D3 D2 D1表示)時,檢驗位應為4位(用P4 P3 P2 P1表示)。可通過表2.3表示的關係,完成把每個數據位劃分在形成不同校驗位的偶校驗值的邏輯表達式中。
表2.3 校驗位與數據位的對應關係
在P1、P2、P3、P4豎列相應行分別填1,
在該4列的低3橫行其它位置分別填0,
在最頂橫行的每個尚空位置都分別填1。
若只看低3橫行,右4豎列的3個bit的組合值分別為十進制的1、2、4、0,則分配 D1 D2 D3列的組合值為3 5 6,保證低3橫行各豎列的編碼值各不相同。
表中D3 D2 D1為三位數據位,P4 P3 P2 P1為四位校驗位。其中低三位中的每一個校驗位P3 P2 P1的值,都是用三個數據位中不同的幾位通過偶校驗運算規則計算出來的。其對應關係是:對Pi(i的取值為1~3),總是用處在Pi取值為1的行中的、用1標記出來的數據位計算該Pi的值。最高一個校驗位P4,被稱為總校驗位,它的值,是通過對全部三個數據位和其它全部校驗位(不含P4本身)執行偶校驗計算求得的。
形成各校驗位的值的過程叫做編碼,按剛說明的規則,4個校驗位所用的編碼方程為:
P4 = D3 D2 D1 P3 P2 P1
P3 = D3 D2
P2 = D3 D1
P1 = D2 D1
由多個數據位和多個校驗位組成的一個碼字,將作為一個數據單位處理,例如被寫入內存或被傳送走。之後,在執行內存讀操作或在數據接收端,則可以對得到的碼字,通過偶校驗來檢查其合法性,通常稱該操作過程為譯碼,所用的譯碼方程為:
S4 = P4 D3 D2 D1 P3 P2 P1
S3 = P3 D3 D2
S2 = P2 D3 D1
S1 = P1 D2 D1
譯碼方程和編碼方程的對應關係很簡單。譯碼方程,是用一個校驗碼和形成這個校驗碼的編碼方程執行異或,實際上是又一次執行偶校驗運算。通過檢查四個S的結果,可以實現檢錯糾錯的的目的。實際情況是,當譯碼求出來的S4、S3、S2、S1的得值與表2.3中的那一列的值相同,就說明是哪一位出錯;故人們又稱表2.3為出錯模式表。若出錯的是數據位,對其求反則實現糾錯;若出錯的是校驗位則不必理睬。舉例如下:
任何一位(含數據位、校驗位)均不錯,則四個S都應為0值;
任何單獨一位數據位出錯,四個S中會有三個為1;如D3錯,則S4 S3 S2 S1為1110。
若單獨一位校驗位出錯,四個S中會有一個或兩個為1;如P1錯,S4 S3 S2 S1為1001,如P4錯,S4 S3 S2 S1為1000。
任何兩位(含數據位、校驗位)同時出錯,S4一定為0,而另外三個S位一定不全為0,此時只知道是兩位同時出錯,但不能確定是哪兩位出錯,故已無法糾錯。如D1、 P2出錯,會使S4 S3 S2 S1為0001。請注意,S4的作用在於區分是奇數位出錯還是偶數位出錯,S4為1是奇數位錯,為0是無錯或偶數位錯。這不僅為發現兩位錯所必需,也是為確保能發現並改正一位錯所必需的。若不設置S4,某種兩位出錯對幾個S的影響與單獨另一位出錯可能是一樣的(不必花費精力推敲),此時若不加以區分,簡單地按一位出錯自動完成糾錯處理反而會幫倒忙。
;url=http%3A//www%2Etjdlgd%2Ecom/wljs/jc/%BC%C6%CB%E3%BB%FA%D4%AD%C0%ED/text/ch02/se01/part3/r2%5F1%5F3%5F2%5F2%2Ehtmb=0a=44user=baidu
Python基本編碼格式
1、一般來說,聲明編碼格式在腳本中是必需的。2、如果Python源碼文件沒有聲明編碼格式,Python解釋器會默認使用ASCII編碼。但出現非ASCII編碼的字符,Python解釋器就會報錯。
1、Python 採用代碼縮進和冒號( : )來區分代碼塊之間的層次。2、在 Python 中,對於類定義、函數定義、流程控制語句、異常處理語句等,行尾的冒號和下一行的縮進,表示下一個代碼塊的開始,而縮進的結束則表示此代碼塊的結束。3、Python 中實現對代碼的縮進,可以使用空格或者 Tab 鍵實現。但無論是手動敲空格,還是使用 Tab 鍵,通常情況下都是採用 4 個空格長度作為一個縮進量(默認情況下,一個 Tab 鍵就表示 4 個空格)。4、對於 Python 縮進規則,初學者可以這樣理解,Python 要求屬於同一作用域中的各行代碼,它們的縮進量必須一致,但具體縮進量為多少,並不做硬性規定。
正確示例代碼:
錯誤示例代碼:
Python中使用 # 進行注釋,我們在使用# 的時候,# 號後面要空一格在行內注釋的時候,中間應該至少加兩個空格
print(“你好,世界”) # 注釋
** 使用的一般性原則:**
1、在二元運算符兩邊各空一格,算術操作符兩邊的空格可靈活使用,但兩側務必要保持一致2、不要在逗號、分號、冒號前面加空格,但應該在它們後面加(除非在行尾)3、函數的參數列表中,逗號之後要有空格4、函數的參數列表中,默認值等號兩邊不要添加空格5、左括號之後,右括號之前不要加添加空格6、參數列表, 索引或切片的左括號前不應加空格
使用的一般性原則:
1、編碼格式聲明、模塊導入、常量和全局變量聲明、頂級定義和執行代碼之間空兩行2、頂級定義之間空兩行,方法定義之間空一行3、在函數或方法內部,可以在必要的地方空一行以增強節奏感,但應避免連續空行
1、導入總應該放在文件頂部,位於模塊注釋和文檔字符串之後,模塊全局變量和常量之前。
2、導入應該按照從最通用到最不通用的順序分組,分組之間空一行:
3、每個 import 語句只導入一個模塊,盡量避免一次導入多個模塊
命名規範這一塊的大家應該都比較熟悉了,但是不同的編程語言之間的明明規範也是有所區別的~
Python命名建議遵循的一般性原則:
引號使用的一般性原則:
Python跟其他幾個主流編程語言的分號使用區別很大Python的代碼末尾不需要加分號,而Java和C#等都需要添加
不要在行尾添加分號,也不要用分號將兩條命令放在同一行,例如:
Python學習日記
原創文章,作者:FOJYC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127459.html