模二算法
① 什么叫按位模2加运算啊
所谓模2加,就是相加后达到2就进位,但只保留一位。比如0+0=0不必进位,所以保留为0。0+1=1不必进位,保留为1。1+1=10,保留为0。这种效果也就是按位异或运算(进行运算的两位相同位结果为0,不同结果为1)。
② 计算机组成原理中,纯小数的模为什么是2啊
因为存在一个符号位。
模:是计量器具的容量,或称模数。
在计算机中,机器数表示数据的字长即位数是固定的。其模数的大小: 1)对于n位整数(含一位符号位),则它的模数为2的 n次方 , 2)对于纯小数(含符号位),则它的模数总是2。
二进制计数中模数为2的n次方,n为二进制位数,对于纯小数,它们的模永远都是2,因为一旦小数位全为1后就会进位位整数位,所以小数位的周期都是2,即模数(容量)为2。
模2运算是一种二进制算法,CRC校验技术中的核心部分。与四则运算相同,模2运算也包括模2加法、模2减法、模2乘法、模2除法四种二进制运算。与四则运算不同的是模2运算不考虑进位和借位,模2算术是编码理论中多项式运算的基础。模2算术在其他数字领域中的应用也是很广泛的。
(2)模二算法扩展阅读 :
模2除法具有下列三个性质:
1、当最后余数的位数小于除数位数时,除法停止。
2、当被除数的位数小于除数位数时,则商数为0,被除数就是余数。
3、只要被除数或部分余数的位数与除数一样多,且最高位为1,不管其他位是什么数,皆可商1。
模2算术是编码理论中多项式运算的基础。模2算术在其他数字领域中的应用也是很广泛的。
参考资料来源:网络-模2运算
参考资料来源:网络-计算机组成原理
③ 模2除法的运算过程是怎么样的
被除数÷除数(4位二进制),从被除数高位起,取4位,>除数,商记为1;<除数,记为0。
怎么会4个O。因为上一位除数与被除数相等,相减差为3个0,本次除从被除数上拖1位下来,该位正好是0。
供参考
④ 请教模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,列竖式计算:
模二除法
⑤ 什么是模2运算
模2运算是一种二进制算法,CRC校验技术中的核心部分,因此,我们在分析CRC算法之前,必须掌握模2运算的规则。与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种二进制运算。而且,模2运算也使用与四则运算相同的运算符,即“+”表示模2加,“-”表示模2减,“×”或“·”表示模2乘,“÷”或“/”表示模2除。与四则运算不同的是模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。
⑥ crc里的模二算法
是把整个所有字节看成一组二进制来除,
而且按道理应该一个位一个位的除,
但是由于这个除法具有一些规律,也能一次计算多个位(畅畅扳堆殖瞪帮缺爆画比如8个位),
这样你看到的最后计算就是每次都是处理的一个字节.
另外,实际的crc计算还有一些问题要考虑
(1)任何长度的全0串,crc的结果都是0,
这意味者如果数据最前面被增加或者减少了0,crc无法检测出来,
为了解决这个问题,一般crc计算会直接指定一个初始值,就是相当于在最前面加了个非0的前缀,这样就能检测出这种情况.
(2)一般crc的结果是作为附加数据放在原来数据的末尾,
这种情况下,
如果直接把这个附加了crc的数据做crc计算,会得到0,
这时候也会有(1)的类似问题,
如果直接用拉通的crc是否为0来判断,
则在最后可能会有多余的0,
无法检测出来.
因而有的crc规定最后的crc要做一个变换(比如取反)然后再加在结尾,
这样就不可以用拉通crc为0来检查了.
⑦ 要发送的数据为1101011011,采用crc的生成多项式是p(x)= +x+1,求应添加在数据
作二进制除法。
1、发送数据比特序列为1101011011(10比特)。
2、生成多项式比特序列为10011(5比特,K=4),X的指数就是代表第几位为1,而且1=X的0次方。
3、将发送数据比特序列乘以2的K(由2可知K为4),那么产生的乘积为11010110110000。
4、将乘积用生成多项式比特序列去除,按模二算法得到余数1110。
模二算法就是两数相减不产生借位,0-1=1。
步骤如如下所示:
(7)模二算法扩展阅读:
二进制除法的CRC校验原理。
RC校验原理看起来比较复杂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。
当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。
如果有余数,则表明该帧在传输过程中出现了差错。
【详细说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。
相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。如100101除以1110,结果得到商为11,余数为1。
参考资料来源:网络--CRC校验
⑧ 二进制求余数(模2算法),怎么用C语言实现
求得结果是返回得到的余数么?是转换为二进制还是??
如果是转换为二进制则代码如下:
//test3.cpp:定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<stdio.h>
#include<iostream>
#include<math.h>
usingnamespacestd;
voidcomput(intx,char*s);
int_tmain(intargc,_TCHAR*argv[])
{
intx,i;
chars[32];
scanf("%d",&x);
comput(x,s);
for(i=strlen(s),i--;i>=0;i--)
{
cout<<s[i];
}
printf(" ");
system("pause");
return0;
}
voidcomput(intx,char*s)
{
inty;
inti=0,j;
while(true)
{
if(x%2==0)
{
s[i++]='0';
}
else
{
s[i++]='1';
}
j=x/2;
x=j;
if(j==0)
{
s[i]='