模2算法
① 什么是模2运算
模2运算是一种二进制算法,CRC校验技术中的核心部分,因此,我们在分析CRC算法之前,必须掌握模2运算的规则。与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种二进制运算。而且,模2运算也使用与四则运算相同的运算符,即“+”表示模2加,“-”表示模2减,“×”或“·”表示模2乘,“÷”或“/”表示模2除。与四则运算不同的是模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。
② 模2除法的运算过程是怎么样的
被除数÷除数(4位二进制),从被除数高位起,取4位,>除数,商记为1;<除数,记为0。
怎么会4个O。因为上一位除数与被除数相等,相减差为3个0,本次除从被除数上拖1位下来,该位正好是0。
供参考
③ 什么叫按位模2加运算啊
所谓模2加,就是相加后达到2就进位,但只保留一位。比如0+0=0不必进位,所以保留为0。0+1=1不必进位,保留为1。1+1=10,保留为0。这种效果也就是按位异或运算(进行运算的两位相同位结果为0,不同结果为1)。
④ 请教模2除法,模2加法,模2减法的具体推算步骤。
1、加法,模二加的运算法则是:
0+0=00 + 1 = 1 1+ 0 = 1 1+ 1 = 0
理解:两个二进制数相加不考虑进位,例如01 + 11 = 10,对于两个数的低位都是1,进行模二和为0,但是没有进位,所以高位的0 加1 还是1,因为不考虑低位的进位。
2、减法,模二减的运算法则:
0 - 0 = 0 0 - 1 = 1 1 - 0 = 1 1 - 1 = 0
例: 1 0 1 0
- 0 1 1 0
---------------------
1 1 0 0
上式的减法中,第三位的减法中0-1,如果按照二进制的减法是有借位的,但是对于模二减是没有借位的,所以才会有第四位中的1-0仍然为1。
细心的同学会发现,其实两个数的“模二加”和“模二减”的结果都是一样的,也就是我们说的“异或”,各位亲,你们说是不是?
3、乘法,模二乘的运算法则:
0 * 0 = 0 0 * 1 = 0 1 * 0 = 0 1 * 1 = 1
例如:1011
X111
---------------
1011
1011
1011
-------------------
110001
模二乘与一般二进制乘法的区别是在于下面的加法部分,模二乘的加法部分依然是模二加的法则
4、除法,模二除运算法则:
模2除法运算定义为:
0÷1=0 1÷1=1
多 位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确 定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根
据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义
的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2
除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷1011=1110……110,列竖式计算:
模二除法
⑤ crc里的模二算法
是把整个所有字节看成一组二进制来除,
而且按道理应该一个位一个位的除,
但是由于这个除法具有一些规律,也能一次计算多个位(畅畅扳堆殖瞪帮缺爆画比如8个位),
这样你看到的最后计算就是每次都是处理的一个字节.
另外,实际的crc计算还有一些问题要考虑
(1)任何长度的全0串,crc的结果都是0,
这意味者如果数据最前面被增加或者减少了0,crc无法检测出来,
为了解决这个问题,一般crc计算会直接指定一个初始值,就是相当于在最前面加了个非0的前缀,这样就能检测出这种情况.
(2)一般crc的结果是作为附加数据放在原来数据的末尾,
这种情况下,
如果直接把这个附加了crc的数据做crc计算,会得到0,
这时候也会有(1)的类似问题,
如果直接用拉通的crc是否为0来判断,
则在最后可能会有多余的0,
无法检测出来.
因而有的crc规定最后的crc要做一个变换(比如取反)然后再加在结尾,
这样就不可以用拉通crc为0来检查了.