這幾天在研究海明碼,發現這玩意挺厲害的。但是無論網上還是書中,沒用的東西寫了一大堆,就是搞不明白。最多就知道校驗位和數據位的大概排列順序,所以寫一篇博客記錄一下(可能也有寫的不錯的,我沒有找到,我打算寫個簡單一點的)。
海明碼介紹
海明碼不僅可以校驗,還可以糾錯,只能錯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.如果多組出現錯誤,那麼就是這幾組共同校驗的那位出現錯誤。
海明碼原理
研究海明碼爲什麼可以做到以上的內容。
大概明白,但是還有點其他事情要做,而且還要再思考思考。
留坑佔用,以後會更新吧?