其实crc已经反反复复看了好多遍了,每次总是看到一半就放弃了,觉得太简单,都有现成的东西,没必要搞懂,纯属浪费时间,但是又总是如鲠在喉,一如既往的纠结……这两天终于明白了它并行实现的原理,写个总结。
1 串行实现(单bit实现)
crc的实现原理很简单,做二进制除法得到余数就可以了,贴一个对我理解CRC很有帮助的一篇文章
我学习CRC32、CRC16、CRC原理和算法的总结(与WINRAR结果一致)
这里面的叫法是直接计算法和驱动表法,可能是因为软件实现和硬件实现不一样的原因吧,我这里叫串行实现和并行实现。
2 并行实现(8bit并行)
串行实现的效率是非常低的,特别是数据量很大的时候。
2.1 并行实现的思想
并行实现的原理主要利用的是异或(XOR)的交换律
A⊕B1⊕B2⊕B3=A⊕(B1⊕B2⊕B3) A⊕B_1⊕B_2⊕B_3 = A⊕(B_1⊕B_2⊕B_3)A⊕B1⊕B2⊕B3=A⊕(B1⊕B2⊕B3)
我们知道二进制除法其实就是不停的移位与被除数进行异或,像下面这样
可以看到经过3次移位异或得到了余数0010,我们把前面的零补上来看更直观