计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索
筆者在閱讀華中科技大學譚志虎老師主編的《計算機組成原理(微課版)》教材進行復習時,產生了一個疑問,并針對性地進行了一些思考。歡迎廣大復習到這里同樣有問題的同學(寒假開學接著考試實在有點汗,誰愿意寒假學習啊)&&CSDN博友針對我的疑問或想法進行批評討論。
在編寫本篇文章前,我參考了博主黎貓大俠的博客,鏈接放在下面。一道題帶你搞懂CRC循環冗余校驗是如何糾錯的, 體會CRC的奇妙之處, 獻給充滿好奇心的你._黎貓大俠的博客-CSDN博客_crc糾錯
這位博主的文章給我啟發很大,感謝大蝦0w0。但我在讀完后仍然有一些問題。下面大概說一下我的想法:
作為循環冗余校驗碼,CRC的檢錯性能是大家有目共睹的。只要我們拿著帶CRC碼的信息去模2除以生成多項式,得到的余數不為0,我們便曉得是有錯誤出現了。
如果想要更加具體一點,知道哪位/哪幾位錯了,我們可以提前做一些計算工作,然后去查生成多項式對應的余數表格(類似于下圖這種,實際應用中應該也能提前算出來)。如果數據信息比較短、選擇的生成多項式比較好,比如(7,3)碼的一些生成多項式,我們就可以利用提前搞出來的表格,順利區分一位錯和兩位錯,并在沒有3位錯的前提下檢查出兩位錯和糾正一位錯。
但是:對于CRC一位糾錯性能的介紹,課本上語焉不詳,只是說“可以利用CRC的編碼特性設計組合邏輯電路來進行糾錯”(“編碼特性”是CRC的循環特性,也即:將余數左移一位除以生成多項式,得到下一個余數,再左移做除法得余數,重復這般操作,最后余數會循環變回自己。這一點在前文提及的博客里說得很詳細,如果不知道可以跳轉先去看看);網絡上我搜集了一些資料,也只有前文博客在承認具有糾錯功能的基礎上講述得比較詳細(或許是我的信息檢索能力比較差吧)。不過,基于前文博客的內容,我產生了一個疑惑,這里放一段博客里的話:
做個類比。假若我面對的是一個約定好的、稍微有些冷門的生成多項式,計算機咋就知道第一位出錯的余數是啥(即上面情況中的101)?如果說,我已經在計算機里存儲好了(或者手邊就有)前文說的那種余數表,那我大可不必大費周章再來搞什么循環計算,直接查一下對應過去就完事了;如果我沒有存這種余數表,那我還啥也不知道呢,(包括第一位出錯的余數),我怎么就能曉得第一位出錯的余數究竟是循環過程中的哪個呢?
(當然,現在看來思考這個問題的意義好像不大,因為沒必要用冷門的生成多項式去實現一些功能,且CRC好像主要還是用來檢錯而不是糾錯的)(之所以想這些才不是因為有一道作業題我寫的答案很逆天,被分數gank了,嘗試給自己找個臺階下呢QAQ)
我對這個問題的考慮是這樣的:
先對一些定義或約定進行說明:
將原信息用一個信息多項式M(x)表示,其中Ci序列就是原來的數據信息,可以取0/1。
將M(x)左移r位,表示成,這樣就能在右側空出r位放產生的CRC校驗碼。
用按照 模2運算規則 除以 生成多項式G(x) ,得到的余數R(x)就是待填入的CRC校驗碼。
(注意:模2運算規則下加運算和減運算效果相同)
也就是說,最后得到的含CRC校驗碼的信息應該是: M(1)|R(1)? (“|”表示把他倆連接起來)
我們有等式: (重要)
? ? ? ? ? ? ? ? ? ? ①
說一個猜想:這個例子中第一位錯的時候余數是101;k=4,r=3,G(x)=1011。那么有沒有這樣一種可能,第一位錯的余數與k、r、G(x)的取值直接相關,所以我們可以直接算出當前CRC約定下的第一位錯的余數而不用拐著彎的去算余數表,并為后續利用循環特性完成的計算提供數據基礎?(后面的證明如果有反例或者邏輯錯誤請速速聯系我,主打一個光速恥辱刪帖好吧)?
道理還是比較簡單的,就是寫起來和表達起來有點繁瑣。對于只有第一位出錯而言,他只影響最高的信息位。記影響前M(x)的定義與前文相同,影響后M'(x)的定義為:
顯然,與的值 可以且僅可以 為1/0和0/1兩種組合情況。而在模2運算下,加運算和減運算等效,因此我們有:? ? ? ②
由等式①和等式②,我們作出如下敘述:(鍵盤敲太麻煩,寫起來 2^{***} 跟 x^{***} 又寫得挺混亂的,但意思應該能到吧,求諒解T T) (“?”就指代例子中我們在此處研究的“101”)
總結一下:
設第一位出錯時的余數為'?',那么它的計算方法是:?
這樣,我們在拿到CRC生成的規則后,就可以找到一種行之有效的方法迅速推理出第一位出錯時的余數是啥,而且是當前約定好的CRC生成規則(k、r、G(x)的取值固定)下“放之四海而皆準”的余數。一切問題也就迎刃而解。剩下的,如果想搞余數表,整個水落石出、明明白白,那就放手去做吧,搞余數表或者查現成的表;如果想好好體驗一把“CRC循環特性”(霧),就可以祭出黎貓大俠的方法,體驗就完事了。(雖然我感覺這種體驗其實并不好,打表才是yyds)
因為我還沒學完(平時沒聽課,悲),所以上面的內容僅代表個人觀點。希望上文對您有幫助!如果有紕漏疏忽的地方,敬請批評指正!如果有沒講明白的地方,歡迎評論留言!如果馬上就要組原考試的話,祝你(也祝我)考個好成績!另外,復習考試不要像我這個joker一樣,對著一個不是考點的東西看起來沒完,快要自學不完了(又悲)...
?
2023-5-6:來還愿,組原考試沒有寄穿,反而成了一眾科目里面發揮還不戳的一門。
祝大家學習組原的道路也一帆風順捏!QWQ(當然不順也沒事,最后弄懂了就行=w=)
總結
以上是生活随笔為你收集整理的计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipython notebook 如何打
- 下一篇: 踌躇满志 未来可期 华云数据广西公司正式