這幾天起床後,就一直在想此奇同位到底如何產生運算的
今天終於想通了,原來就和CRC的想法是一樣
假設今天要被判斷的資料為10100101b
1、把高低4bit 拿來xor
2、再把最低4位元 的高低2bit拿來xor
3、最後再把最低2位元 的高低1bit拿來xor
我們可以發現,這樣的答案是0,也就是有偶數個1
但是如果是奇同位的判斷話,那麼就還要再xor 一次0x01
這樣就可以得到奇同位元的答案了
沒錯,如果是偶同位的話,就不需要做這件事了
原理了解後,當然要改寫一下程式了
原本的程式寫得其實還滿亂的
WORD parity_check(BYTE data){
WORD parity = data;
parity ^= (parity >> 1);
parity ^= (parity >> 2);
parity ^= (parity >> 4);
return ((~(parity & 0x01))& 0x01);
}
經過改良後
WORD parity_check(WORD data){
WORD parity = data;
parity ^= (parity >> 4);
parity ^= (parity >> 2);
parity ^= (parity >> 1);
parity ^= 0x01;
return (parity & 0x01);
}
整齊漂亮多了(最後的return 變乾淨了),而且也變得更清楚好懂了
不過即使是這樣的運算,還是沒有下面的程式來得有效率
WORD parity_check4(WORD data)
{
static const WORD PAR_word=0x9669;
WORD nibble = data>>4;
WORD parity = 0;
parity = (data & 0x0f) ^ nibble;
return ( (PAR_word>>parity) & 0x01 );
}
經過這樣的程式練習,頭腦又活動了一下
沒有留言:
張貼留言