2010年12月8日 星期三

奇同位檢查-續

這幾天起床後,就一直在想此奇同位到底如何產生運算的


今天終於想通了,原來就和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 );
}


經過這樣的程式練習,頭腦又活動了一下


沒有留言:

張貼留言