標籤:
- 周五Java布置的實驗寫了一天,,,心好累
- 周六上午志願者活動導致睡了一下午晚上又去看錶演,,,心好累
- 後來發現我的C幣漲了不少,,,驚訝,,,是因為我寫的部落格的原因嗎?,,,開心~
- 錯誤檢驗與錯誤修正確實是電腦在處理、儲存和傳輸資訊時非常重要的一部分。
- 就算電腦再強大,處理的資料都是錯誤的,那又有何用?
- 就算你再努力,方向是錯的,到頭來還不是一場空
- 就算是人算,也難免會出錯。想起一個遙遠的故事,那個算錯了小數點而自殺提前去天堂佔座的數學家,,,,,,不過似乎自殺的話去不了天堂?不太懂,,,,,,
- 所謂錯誤,就是對於電腦中的用1和0表示的位元據來說,某個或某些位在某種影響下改變了,比如原本的“0001”的第二位受到了某種神秘的影響,導致資料變成了“0011”,自然是很大的錯誤。
- 某種神秘的影響包括
- 電磁幹擾,輻射,震動,,,,,,
- 裝置的老化、損壞,,,,,,
同位碼
- 分析一個問題最常見的思維就是從最簡單的情況入手
- 奇偶檢驗碼的原理:
- 多設定一個位(檢驗位)來記錄一個位元據也就是一串01裡面所包含的1的個數的奇偶性
- 根據不同的實現方式,分為奇檢驗和偶檢驗
- 奇檢驗Odd Parity
- 檢驗位為1,表示資料(不包含檢驗位)中1的個數為偶數個,加上檢驗位的話也就是由“奇數”個,正所謂奇檢驗
- 檢驗位為0,表示資料(不包含檢驗位)中1的個數為奇數個,本來就已經是奇數了,那就不需要檢驗位的幫忙了,檢驗位取0就好
- 偶檢驗Even Parity
- 怎麼算?還記得神奇的異或運算嗎?
- 兩個數做異或運算
- 而n個數做異或運算
- 如果n個數中有奇數個1,則結果為1
- 如果n個數中有偶數個1,則結果為0
- 異或大法好,一下就可以得出奇偶性了。
- 為啥這樣規定?
- 直覺上我們想,奇檢驗的檢驗位為1,1表示真,也就是資料中“真的有奇數個1”
- 但是實際在編碼的時候,檢驗位也屬於資料啊!所以奇檢驗的檢驗位為1所表示的“真”的含義,就是所有的資料位元包括檢驗位中1的個數為奇數個。
- 這樣也方便電腦實現,而不需要單獨把檢驗位挑出來,只需要事先規定好我們用的是奇檢驗還是偶檢驗就可以。
- 對於奇檢驗,我們把所有的資料包括檢驗位一起做XOR運算,如果結果為1則認為資料沒出錯,否則認為資料有誤。
- 對於偶檢驗,一起做XOR的結果應當為0才認為資料沒有出錯。
- 然而奇偶檢驗只能發現“奇數個資料位元的錯誤”,因為“奇數”才能影響原本的奇偶性
- 不過因為實現起來很簡單,而且實際上占不小比例的錯誤都只是一個位的出錯,所以奇偶檢驗應用很廣泛
海明碼
細說海明碼
編碼位 |
B1 |
B2 |
B3 |
B4 |
B5 |
B6 |
B7 |
B8 |
… |
二進位編號 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
… |
對應含義 |
P1 |
P2 |
D1 |
P3 |
D2 |
D3 |
D4 |
P4 |
… |
檢驗位 |
P1 |
P2 |
|
P3 |
|
|
|
P4 |
… |
資料位元 |
|
|
D1 |
|
D2 |
D3 |
D4 |
|
… |
- 很有美感的規律
- 檢驗位 Pi 對應的編碼位為 Bj ,則有 j 的二進位編碼有且僅有第i位為1
- P1,對應2^0=1,對應B1,即“0001”僅有第1位為1
- P2,對應2^1=2,對應B2,即“0010”僅有第2為為1
- P3,對應2^2=4,對應B4,即“0100”僅有第3位為1
- P4,對應2^3=8,對應B8,即“1000”僅有第4位為1
海明碼的編碼方法
- 具體的編碼方法
- 資料位元D1、D2、D3、D4……即存放原始的資料
- 下面講檢驗位要如何得到:
- 每個檢驗位所負責的資料位元
- P1:B1、B3、B5、B7……
- P2:B2、B3、B6、B7……
- P3:B4、B5、B6、B7……
- P4:B8、B9、B10、B11……
- 看上面的大概是很難看出什麼規律,不過我們把 Bj 的 j 寫成二進位的話,那就有一個很美的規律了
- P1:B0001、B0011、B0101、B0111……
- P2:B0010、B0011、B0110、B0111……
- P3:B0100、B0101、B0110、B0111……
- P4:B1000、B1001、B1010、B1011……
- 噹噹當,規律就是
- Pi 所負責的所有的 Bj,其 j 的二進位編碼的第 i 位都是1
- 也就是對於任意一個 Bj,如果 j 的二進位編碼的第 i 位為1,則 Bj 就會由 Pi 負責。
- 顯然,一個 Bj 有可能會有多位為1,那麼這一位 Bj 自然也就對應著多個負責的檢驗位
- 對於檢驗位,由於檢驗位對應的 Bj 的 j 的二進位有且只有一位為1,所以檢驗位實際上必然只對自己負責
- 對於資料位元,由於對應的 Bj 的 j 的二進位必然有2位以上為1(因為只有1位為1的必然是檢驗位),所以一個資料位元至少被兩個檢驗位所負責
- 規定好了每個檢驗位所負責的編碼位了之後,那麼檢驗位如何求呢?很簡單,那就是奇偶檢驗
編碼位 |
B1 |
B2 |
B3 |
B4 |
B5 |
B6 |
B7 |
B8 |
… |
二進位編號 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
… |
對應含義 |
P1 |
P2 |
D1 |
P3 |
D2 |
D3 |
D4 |
P4 |
… |
負責關係P1 |
P1 |
|
D1 |
|
D2 |
|
D4 |
|
… |
負責關係P2 |
|
P2 |
D1 |
|
|
D3 |
D4 |
|
… |
負責關係P3 |
|
|
|
P3 |
D2 |
D3 |
D4 |
|
… |
負責關係P4 |
|
|
|
|
|
|
|
P4 |
… |
海明碼的使用方法
- 那麼我們如何來看待這種美感規律之下的編碼呢?即這種編碼方案下如何檢驗錯誤與錯誤修正呢?
- 我們說海明碼具有1位的檢驗與錯誤修正能力,和2位的檢驗能力
- 對於1位的出錯
- 若為檢驗位,則該檢驗位所對應的一個負責關係將通不過奇偶檢驗
- 若為資料位元,則該資料位元對應的多個負責關係將通不過奇偶檢驗
- 那麼對於所有的負責關係,我們按照其負責的檢驗位的順序來產生一個位元字,即如果 Pi 所在的負責關係通不過奇偶檢驗,則該產生的位元字的第 i 位記為1,否則記為0
- 神奇的事發生了。我們最後得出來的數字,剛剛好就是出錯的那一位
- 如果是檢驗位出錯,而我們規定檢驗位 Pi 的位置是 B(2^i-1),即 Pi 所在的位置 Bj ,其 j 的二進位編碼有且僅有第 i 位為1,也就是說 Pi 出了錯,而 Pi 的位置剛好是“二進位編碼有且僅有第 i 位為1”的位置。對應關係豈不妙哉
- 如果是資料位元出錯,而我們探索資料位的編碼位 Bj,其 j總是含有多個為1的位,對於每一個第 i 位為1都對應了一個 Pi,那麼在檢驗的時候,必然導致這多個負責關係 Pi 通不過奇偶檢驗,進而產生的位元字的編碼則如同“光路可逆”一般,正好講每一個第 i 位都設定成了1,也就剛好得出了出錯的資料位元的位置。更妙更妙。
- 就此而言,海明碼是我所見過的對二進位規則運用最妙的結構之一。
- 對於2位出錯,仍按上述規則來產生最後的數字,但是此時無法判斷出是哪一位出錯,但產生是數字總不是0。
- 反證法。如果兩位出錯而產生的數字為0。記Bx和By出錯
- 1、若 Bx 為檢驗位,設 Bx 對應的檢驗位為 Pi,由於最後的數字為0,這就要求負責關係 Pi 能通過奇偶檢驗,而奇偶檢驗的最小碼距為2,Pi 本身已經出錯了,所以負責關係 Pi 中必然還有一個編碼為要出錯,而這一位只可能是資料位元,即By只能為資料位元。By若為資料位元,則 By 必然對應兩個以上的負責關係,除了負責關係Pi 外,設第二個為負責關係 Pj,則負責關係 Pj 有且只有 By 對應的資料位元出錯,所以負責關係 Pj 必然通不過奇偶檢驗,所以產生的數字必然不是0。矛盾。
- 2、若 Bx 和 By 均為檢驗位,由1的分析可知不可能。如果假設Bx和By均為檢驗位的話,那麼分別對應了兩個負責關係 Pi 和 Pj,則產生的數字必然不是0。
- 3、若 Bx 和 By 均為資料位元,則 Bx 和 By 必然分別對應著兩個以上的負責關係。由於每個負責關係均為奇偶檢驗,最小碼距為2,這也就要求所有被 Bx 和 By 涉及到的負責關係都需要同時包含 Bx 和 By 才能保證通過奇偶檢驗,所以 Bx 和 By 就必然是同一個編碼位。矛盾。
- 對於3位以上的出錯,產生的數字就有可能是0了。這和資料無誤的最後產生的數字相同。如B3、B5和B6。也就是說我們最少需要改變三位,就可以得到另一個在海明碼規則下合法的編碼了。所以最小碼距為3。
- 實際使用的時候
- 對於常見的1位出錯,如果我們發現的是檢驗位出錯,但實際是檢驗位出錯並不會影響資料位元,也就是說實際的資料無誤,則實際上並不影響資料的傳輸,可以無須糾正。
- 對於2位出錯,我們只能判斷“出錯了”。然而實際上我們也無法確定這究竟是一位的出錯還是兩位的出錯。
- 如果對精度要求不是那麼高的話,一般會預設出錯都是1位出錯,並根據是否是檢驗位來判斷是否需要糾正。
- 如果要求高的話,那麼“一旦出錯”,則會要求重新發送資料。
- 對於3位及以上的錯,部分是可以被檢驗出出錯來的,只有較少數情況下,而且這種情況發生的機率也是十分小的,才會“混過了海明碼檢驗”。
迴圈冗餘校正碼
- CRC碼。Cyclic Redundancy Check。
- 資料通訊領域中最常用的一種查錯校正碼
- 資訊欄位和校正欄位的長度可以任意選定,相對于海明碼那種硬性的結構規定,因為運用了更為靈活的數學知識,所以CRC在長度方面極具靈活性
- 因為不在考試範圍之內,雖然我也憑著興趣研究了一番,然而在過程中極為痛苦,雖然用到了很多數學名詞,然而並沒有讓我感受到數學的美,所以也就不打算在這裡講來讓大家看得痛苦了讓我自己也難受了……
- 有興趣的可以自行Google百度。
Internet Checksum
- 查詢相關內容的時候又發現的一種編碼。
- 不做介紹只記錄下來有這樣一種方法就成
- 以後如果翻到這篇筆記的話,若仍有興緻,可自行Google百度
- 感覺這篇部落格有點水,,,,,,不過我主要是想講海明碼,而又沒有合適的配套講的東西
- 之後我想整理一下編碼,如ASCII、Unicode、UFT,,,這又不只是課本上的一兩頁了。。。比較麻煩而且考試還不考,,不過個人高度興趣就是了。
- 之後會講內容比較多的處理器,以及指令流的概念、最佳化、調度演算法等等,怕是超出了電腦群組成原理的範圍,因為我也想講講電腦體繫結構裡的內容,尤其是指令的動態調度演算法。
電腦群組成.其實機器也會出錯.錯誤檢驗與錯誤修正的資料編碼