今天看到一道面试题,关于单字节校验的方法的。
一个字节,bit7存放着bit0-bit6间bit为1的奇偶性,例如0x7,共有3个(奇数)bit位为1,所以首个bit为1,则整个字节是0x87.
需要设计一个sender和receiver系统来实现传输数据的准确性。
对于这个需求,我的想法是查表,原来是想建立一个2的7次方字节的数组来保存每个数的结果,后来一想其结果就0和1,用字节保存太浪费了,可以用位保存来优化。以下是简单的代码。
byte a[16];//保存结果的表,例如输入的数是108,则从起始位置开始到第108个bit查找结果
//校验函数
bool crc(byte data)
{
return (GET_BIT(data,7)) == (GET_BIT( a[(data&~0x80) >> 3] , (data & 0x7)));
}
GET_BIT(data,7) //获取首个bit位值
GET_BIT( a[(data&~0x80) >> 3] , (data & 0x7)) //先找出data在a[16]中属于哪个字节,在这个字节中找出data%8的那个bit
突然觉得我写的代码有点难看懂它了。。。