1. 程式人生 > >儲存器(四) -- 漢明碼

儲存器(四) -- 漢明碼

Abstract:哈工大計算機組成原理劉巨集偉, 本篇文章主要講述儲存器為什麼要校驗和漢明碼

------------------------------------------

儲存器的校驗

為什麼要校驗?

以記憶體為例, 如果記憶體所處的電磁環境比較複雜, 或者空間環境下受到帶電粒子的打擊, 那麼可能導致電容的充放電或者觸發器的翻轉(SRAM)。 這樣會導致儲存資訊的改變。 如果不校驗, 儲存中儲存的程式可能不會發揮它應有的作用, 甚至會發生嚴重的後果。

編碼的最小距離

任意兩組合法程式碼之間二進位制位數的最小差異、編碼的糾錯、改錯能力與編碼的最小距離有關。 編碼的最小距離就是從一種合法程式碼轉化成另外一種合法程式碼所變化的最小位數。存在如下公式:

L - 1 = C + D ( D >= C)

L:編碼的最小距離

D:檢測錯誤的位數

C:糾正錯誤的位數

漢明碼是一種具有糾錯能力的編碼。

漢明碼的組成:

漢明碼採用奇偶校驗, 奇校驗就是在資料位基礎上加一個校驗位, 使得整個程式碼“1”的個數為奇數。偶校驗就是在資料位基礎上加一個校驗位,使得整個程式碼“1”的個數為偶數。

漢明碼就是採用這樣一種方式, 但是漢明碼採用分組校驗。

比如下面這個例子, 前面是資料位, 在資料位的基礎上面加一個校驗位, 採用偶校驗的方式。

如果整個程式碼“1”的個數為奇數, 我們就知道有一位資料發生了翻轉(因為資料位翻轉的位數越多, 可能性越小。)如果我們將

資料劃分成為兩組,每組都加一個校驗位,那麼可以大大縮小確定發生翻轉的位數的範圍。這種劃分方式是沒有重疊的, 每個分組

的資料連在一起就是原來的資料。

漢明碼採用的是非劃分方式

對於下面這個資料, 我們採用漢明碼的方式。

將資料分為三組, 每組一個校驗位, 每組四位資料。 按照如下方式分組

上、左、右 三個圓分別為 第一組、第二組、第三組。 如果有某組位置錯了就將它置為 1, 沒錯就是 0. 那麼有如下

可以看出P3P2P1組成的二進位制值就是出錯的位置。那麼校驗位應該放在哪裡呢?因為校驗位都是本組獨有的, 所以容易確定為

1、 2、 4;

為什麼P3P2P1組成的二進位制資料能表示出錯的位置呢? 這就和漢明碼獨特的編碼方式有關了, 其實仔細觀察上面的分組規律會

發現一個特點:第一組:1、 3 、5、 7; 這四個數化成二進位制之後, 最後一位都是1; 第二組:2、 3、6、 7;這四個數化成二進位制

之後, 倒數第二位都是1; 同樣第三組數字化成二進位制之後倒數第三位都是1; 然後他們相交的地方:比如3, 倒數第二位和倒數第

一位都是1; 5, 倒數第三位和倒數第一位都是1; 7, 倒數第一、二、三位都是1, 所以7 是三組的交點。如果是第一組和第三組

出錯 那麼 倒數第一、三位為 1, 其他位為 0; 也就是 101 就是 5。 ^-^

這就是漢明碼的編碼方式。

下面談談漢明碼的組成(三要素)

漢明碼需要增加多少位檢測為(即分多少組)?

檢測位的位置?

這個問題前面已經提到過了。 放在 2 的整數次方的位置, 但是比組數少 1, 即第二組放在 2^1 = 2 的位置; 第三組放在

2^2 = 4的位置

檢測位的取值?

先來看看第一個問題:漢明碼需要增加多少位檢測位? 有一個公式:

2^k >= n + k +1

n:資訊位

k:校驗位

接受方的結果要能夠表示出錯的具體位置, 再加上一種全部正確的結果。

檢測位的取值與奇校驗還是偶校驗有關。

ps:關於漢明碼的更多內容請參見百度、google等, 這裡就不貼連結了。