奇偶校驗演算法

2021-09-06 17:55:55 字數 2050 閱讀 3832

1即計算出所給數中包含1的個數

方法一:每一位分別異或(時間複雜度o(n)n代表數字數)

函式功能:如果1的個數為奇數個,則返回1,如果1的個數為偶數個,則返回0。

parity_check(unsigned x)

return val&0x1;//取末位運算. val的二進位制形式最後一位位1則返回1,為0則返回0. }

例項分析,假設無符號數x轉換成二進位制後長度為5位,五個位置的資料(二進位制數,0或者1)分別記為①②③④⑤,兩個位置的數進行異或運算記為①^②。注意,給定x後化成二進位制形式最高位①為1。

則整個程式執行過程(只需要考慮異或運算結果的末位數)可以表述為:

(((⑤^④)^③)^②)^①——表示式1

假設⑤和④不同,則⑤^④運算結果為1,表示有乙個1。表示式1可以化成:((1^③)^②)^①——表示式2

③如果不是1,則表示⑤④③中只有乙個1;如果是1,⑤④③中有兩個1.這兩種結果等價於1^③運算的結果。假設③就是1,則表示式2可以化成:(0^②)^①——表示式3

假設②為0(①為1是前提),則表示式3可以化簡為:(0^0)^1,運算結果為1,即五個二進位制數中有奇數個1,⑤和④中有乙個1,③是1,②為0,①為1共3個1得以驗證。

該演算法形式簡單,功能強大,卻不好理解。該函式可用於奇偶校驗。

上面方法有些問題:

如果輸入的x負數,負數右移,高位會被設為1,那麼這個書最終就會變成oxffffffff而陷入死迴圈。

改進方法:

parity_check(unsigned x)

return val&0x1;//

取末位運算. val的二進位制形式最後一位位1則返回1,為0則返回0.

}

方法二:時間複雜度0(1的個數)

int a=1;

while(x)

方法三:時間複雜度0(lgn)n為位數

8位的資料d(d7~d0),他的演算法為:

d ^= d >>4;

d ^= d >>2;

d ^= d >>1;

d&=1;

最後d就是偶校驗的值了。

可能有的同學一時之間看不明白演算法的原理,這裡解釋一下吧。

首先從d裡面找兩個位d1和d0,而d1d0的偶校驗值e0=d1^d0,這個大家都明白的,然後d3和d2的檢驗值e1=d3^d2,同理還有e2=d5^d4以及e3=d7^d6;

e0=1時代表了d1和d0裡面有奇數個1,e1、e2和e3同理;

然後複習一下小學數學:奇數*奇數=奇數,偶數*奇數=偶數

如果e0和e1裡面有奇數個1,那麼d3~d0裡面就有奇數數個1,此時d3~d0的偶校驗值為1;

「如果e0和e1裡面有奇數個1」這句話的意思不就是求由e1和e0組成的兩位二進位制的偶校驗麼?而且當e1e0的偶校驗值f0=1時,對應的d3~d0的偶校驗值也為1。

同理,e3e2的偶校驗值f1=1時,對應的d7~d4的偶校驗值也為1;

繼續同理,由f1和f0組成的兩位二進位制的偶校驗g0=1時,對應的是e3~e0的偶校驗值為1,同時對應的d7~d0的偶校驗值為1。

於是求d7~d0的偶校驗值變成了求f1f0的偶校驗值。

那麼首先就要將d7~d0的8個位兩兩分組後在分別求異或,然後再將得出的值的4個位兩兩分組後分別異或,最後將得出的值的2個位進行異或,得到的值就是d7~d0的偶校驗值了。

而分組則不必是相鄰的,將d右移4位再和原來的d進行異或的話就簡單多了

d7——d3

d6——d2

d5——d1

d4——d0

如此類推,每次先進行右移,然後和原來的值異或,最終就能得到d的校驗值了;另外在計算的過程中,僅僅需要關注後面的位數就可以了,如第二次計算時,高4位會有一些資料,到最後高7位也會有資料的,但這些資料都已經沒有用了,所以最後只需要來乙個&1就可以l。

於是文章開頭的那段8位二進位制數的演算法為:

d ^= d >>4;

d ^= d >>2;

d ^= d >>1;

d&=1;

另外對於2^n位二進位制數,第一次右移(2^n)/2位後再異或,然後重複類似的計算n次就可以了。

java 奇偶校驗

奇校驗 param bytes 長度為8的整數倍 param parity 0 奇校驗,1 偶校驗 return throws exception public static byte parityofodd byte bytes,int parity throws exception if par...

奇偶校驗原理

奇偶校驗原理 通過計算資料中 1 的個數是奇數還是偶數來判斷資料的正確性。在被校驗的資料後加一位校驗位或校驗字元用作校驗碼實現校驗。校驗位的生成方法 奇校驗 確保整個被傳輸的資料中 1 的個數是奇數個,即載荷資料中 1 的個數是奇數個時校驗位填 0 否則填 1 偶校驗 確保整個被傳輸的資料中 1 的...

Parity check(奇偶校驗)

description input multiple test cases.each test case is an integer n 0 n 101000 in a single line.output for each test case,output the answer of f n mo...