海明碼

這幾天在研究海明碼,發現這玩意挺厲害的。但是無論網上還是書中,沒用的東西寫了一大堆,就是搞不明白。最多就知道校驗位和數據位的大概排列順序,所以寫一篇博客記錄一下(可能也有寫的不錯的,我沒有找到,我打算寫個簡單一點的)。

海明碼介紹

海明碼不僅可以校驗,還可以糾錯,只能錯1位,錯再多就檢測都檢測不出來了。
海明碼是海明發明的,在牛X哄哄的實驗室–貝爾實驗室裏面發明的,故事自行百度。

海明碼計算

以下均爲偶校驗,堅決不用8位數字來充當數據位,爭取提供具有廣泛性的方法

海明碼校驗位與數據位的關係

2^k -1 >= m+k
k:校驗位 m:數據位
需要計算時,可以用這個公式計算下需要幾個校驗位,其他時候直接排列校驗位和數據位就可以。
排列方式:

1 2 3 4 5 6 7 8 9 10 11 12 13
k1 k2 k3 k4
m1 m2 m3 m4 m5 m6 m7 m8 m9

規律就可以看出來了:
第1個和第2個都是校驗位;第2個校驗位後跟隨2^1-1個數據位,然後是第3個校驗位;第3個校驗位後跟隨2^2-1個數據位,然後是第4個校驗位;…… 依此類推

計算方法

設 數據位 101011001
所以 數據位+校驗位就是 ??1?010?11001

1 2 3 4 5 6 7 8 9 10 11 12 13
k1 k2 k3 k4
1 0 1 0 1 1 0 0 1

k1的求法:1 3 5 7 9 11 13是不是偶數個1?如果是,k1就是0,否則就是1。
從第1(2^0)位開始,就是隔1(2^0)位計算1(2^0)位
k2的求法:2 3 6 7 10 11 14是不是偶數個1?如果是,k2就是0,否則就是1。
從第2(2^1)位開始,就是隔2(2^1)位計算2(2^1)位
…… 依此類推

1 2 3 4 5 6 7 8 9 10 11 12 13
k1 1 0 1 0 1 1 0 0 1
1 k2 1 0 1 0 1 1 0 0 1
1 1 1 k3 0 1 0 1 1 0 0 1
1 1 1 0 0 1 0 k4 1 1 0 0 1

所以,最後的海明碼就是:1110010111001

海明碼糾錯

接下來就是糾錯:
假設第一次,錯在第4位(校驗位)了。1111010111001
假設第二次,錯在第5位(數據位)了。1110110111001
判斷是否正確依然採用偶校驗,就是說如果有偶數個1,那麼就是正確;如果是奇數個1,就是錯誤。
第一次糾錯:

檢測 1 2 3 4 5 6 7 8 9 10 11 12 13 校驗
k1 1 1 1 1 0 1 0 1 1 1 0 0 1 正確
k2 1 1 1 1 0 1 0 1 1 1 0 0 1 正確
k3 1 1 1 1 0 1 0 1 1 1 0 0 1 錯誤
k4 1 1 1 1 0 1 0 1 1 1 0 0 1 正確

只有k3組出現錯誤,所以是k3組的校驗碼錯誤,是第4位。
第二次糾錯:

檢測 1 2 3 4 5 6 7 8 9 10 11 12 13 校驗
k1 1 1 1 0 1 1 0 1 1 1 0 0 1 錯誤
k2 1 1 1 0 1 1 0 1 1 1 0 0 1 正確
k3 1 1 1 0 1 1 0 1 1 1 0 0 1 錯誤
k4 1 1 1 0 1 1 0 1 1 1 0 0 1 正確

k1和k3兩組出現錯誤,所以是k1和k3倆組的共同校驗的數據位出現錯誤,可以看到是第5位,爲什麼不是第11位,因爲11位是k1,k3,k4三組共同校驗的,如果是k1,k3,k4都出現錯誤,那麼就是11位。
總結:
1.如果僅有1組出現錯誤,那麼就是這1組的校驗位出現錯誤。
2.如果多組出現錯誤,那麼就是這幾組共同校驗的那位出現錯誤。

海明碼原理

研究海明碼爲什麼可以做到以上的內容。
大概明白,但是還有點其他事情要做,而且還要再思考思考。
留坑佔用,以後會更新吧?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章