輕鬆理解CRC差錯檢測演算法

2021-12-29 19:54:59 字數 1687 閱讀 9869

已經展開討論了多項式,我們現在聚焦於真正的運算問題上,這是crc運算中進行的全部運算,即2進製無進製運算。通常,這也被稱作是多項式運算,但正如我已經宣稱的,此文後面的部分中都不會有「多項式的」這樣的名稱,相反我們必須叫它crc運算。因為,這個運算是crc計算中的關鍵所在,我們最好去適應它。

現在開始:

除了沒有進製外,crc中2個數相加與通常的2進製相加沒有區別。這就是說,和的某位的值由參與運算的兩個數的對應位的值來決定 ,結果不受其他位影響。例如:

10011011

+11001010

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

01010001

每個位值計算只會有4種情形:

0+0=0

0+1=1

1+0=1

1+1=0 (無進製)

減法也是一樣:

10011011

-11001010

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

01010001

同樣:0-0=0

0-1=1

1-0=1

1-1=0

事實上,crc中的加法和減法都和xor操作是一致的,xor是異或。這很大程度上把第乙個冪級(加法、減法)的操作減少到一次操作,異或。這是這個運算非常方便的乙個地方。

把加法和減法搞亂以後,運算除去最高位,沒有別的比較大小的途徑。1010明顯看來是比10大,但它可不比1001大。為了弄明白這點,注意,你可以通過1010和1001相加相減都到相同的值。

1010 = 1010 + 0011

1010 = 1010 – 0011

這令排序沒有了意義。

已經定義了加法,我們可以轉向乘法和除法。乘法是直接進一步,把求和式中的第乙個數,按照第2個數的逐位移動,

1101

x 1011

----

1101

1101.

0000..

1101...

-------

1111111

注:求和是使用crc加法。

除法卻是有一點麻煩,因為我們需要知道,什麼時候乙個數能除動乙個數。為了做到這點,我們給出之前定義的大小關係的弱定義:如果x的最高位是比y的最高一們相等或者更大,那麼就說x是與y相等,或者更大。這裡是乙個完整的除法運算示例。

(引自[tanenbaum81])

這就是它了。在更進一步之前,玩味一下這個運算法則以便更加習慣它,絕對是有用的。我們已經玩味了加法和減法,注意到,它們是一樣的。這裡,然而,我們應該注意到,這樣的法則,a+0=a,a-0=a。這是很明顯的性質,稍後卻會有用。

在處理crc的乘除法時,體會下乘法和除法的概念是相當有用的。如果乙個數a是b的整數倍,在crc運算中,就表示可以通過從0 xor一些b的各種移位操作結果得到。如,如果a是0111010110 b是11,我們可以如下從b得到a

0111010110

= .......11.

+ ....11....

+ ...11.....

.11....…

如果a是0111010111,不可能通過各種移位操作來得到a,(你知道為什麼嗎?答案稍後揭曉),這樣就說a在crc運算中不能被b整除。

這樣,我們看到crc運算主要是通過在不同的偏移處,xor特定的值。

VIBE檢測演算法

一 vibe 獲取目標 其他演算法處理 最終目標 優點 記憶體占用少,處理速度快,計算量小,檢測效果好 無引數法 可直接應用在產品中,軟硬體相容性好 效能優於混合高斯,引數化方法,sacon等 背景模型及時初始化 具有較好的抗噪能力。缺點 ghost區域 挑戰 必須適應環境的變化 比如光照的變化造成...

素數檢測演算法

因為1既不是素數也不是合數,所以下面的實現 中不考慮小於2的情況。本文以c語言進行講解,建議對著完整的原始碼看。最原始 最粗暴的方法就是從頭到尾逐個進行檢測,一旦遇到可被整除的數馬上返回false bool is prime 1 int n return true 該演算法時間複雜度為n2 n 2對...

邊緣檢測演算法

邊緣是由灰階等高線定義的,穿過等高線時,灰階會迅速變化,沿著等高線走,灰階值的變化會更加輕柔,有可能是隨機變化的,因此邊緣具有乙個可以測量的方向。邊緣畫素和雜訊畫素相比周圍的畫素都有明顯的變化,而邊緣畫素互相連線,構成等高線,因此可以通過這一特性區分邊緣畫素和雜訊畫素。1 數位化 影象的取樣不可能使...