轻松理解CRC差错检测算法(A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS)三

来源:互联网 发布:飞升真元段体数据 编辑:程序博客网 时间:2024/04/27 14:08
5 无进位2进制运算(作者版权声明见本系列第1篇)
    已经展开讨论了多项式,我们现在聚焦于真正的运算问题上,这是CRC运算中进行的全部运算,即2进制无进位运算。通常,这也被称作是多项式运算,但正如我已经宣称的,此文后面的部分中都不会有“多项式的”这样的名称,相反我们必须叫它CRC运算。因为,这个运算是CRC计算中的关键所在,我们最好去适应它。现在开始:
    除了没有进位外,CRC中2个数相加与通常的2进制相加没有区别。这就是说,和的某位的值由参与运算的两个数的对应位的值来决定 ,结果不受其他位影响。例如:
            10011011
         +11001010
          ----------------
            01010001
    每个位值计算只会有4种情形:
        0+0=0
        0+1=1
        1+0=1
        1+1=0    (无进位)
减法也是一样:
        10011011
       -11001010
        --------------
        01010001
同样:
        0-0=0
        0-1=1
        1-0=1
        1-1=0

    事实上,CRC中的加法和减法都和XOR操作是一致的,XOR是异或。这很大程度上把第一个幂级(加法、减法)的操作减少到一次操作,异或。这是这个运算非常方便的一个地方。
    把加法和减法搞乱以后,运算除去最高位,没有别的比较大小的途径。1010明显看来是比10大,但它可不比1001大。为了弄明白这点,注意,你可以通过1010和1001相加相减都到相同的值。
        1010 = 1010 + 0011
        1010 = 1010 – 0011
    这令排序没有了意义。
    已经定义了加法,我们可以转向乘法和除法。乘法是直接进一步,把求和式中的第一个数,按照第2个数的逐位移动,

          1101
       x 1011
          ----
          1101
         1101.
        0000..
       1101...
       -------
       1111111
注:求和是使用CRC加法。
    除法却是有一点麻烦,因为我们需要知道,什么时候一个数能除动一个数。为了做到这点,我们给出之前定义的大小关系的弱定义:如果X的最高位是比Y的最高一们相等或者更大,那么就说X是与Y相等,或者更大。这里是一个完整的除法运算示例。
(引自[Tanenbaum81])

           

     这就是它了。在更进一步之前,玩味一下这个运算法则以便更加习惯它,绝对是有用的。我们已经玩味了加法和减法,注意到,它们是一样的。这里,然而,我们应该注意到,这样的法则,A+0=A,A-0=A。这是很明显的性质,稍后却会有用。

    在处理CRC的乘除法时,体会下乘法和除法的概念是相当有用的。如果一个数A是B的整数倍,在CRC运算中,就表示可以通过从0 XOR一些B的各种移位操作结果得到。如,如果A是0111010110 B是11,我们可以如下从B得到A
        0111010110
        = .......11.
        + ....11....
        + ...11.....
           .11....…
如果A是0111010111,不可能通过各种移位操作来得到A,(你知道为什么吗?答案稍后揭晓),这样就说A在CRC运算中不能被B整除。
    这样,我们看到CRC运算主要是通过在不同的偏移处,XOR特定的值。
0 0