摩二算法
Ⅰ 7. 现要发送的数据是1101011011,采用的CRC生成多项式为为G(X)=X4+X+1,试求校验码。如果接收方收到的数据
①计算信息编码多项式T(x)
M(X)=1101011011 G(x)=10011
生成多项式的最高次幂r=4,信息码附加4个0后形成新的多项式。
M'(x):11010110110000
②用模2除法求M'(x)/G(x)的余数
③得出要传输的循环冗余校验码多项式
将余数1110直接附加在M(x)的后面得T(x)=11010110111110
④接收端对接收到的T(x)进行校验
设接收端接收到的数据为多项式T’(x),将T’(x)除以G(x),若余数为0,即T’(x)=T(x),则认为没有错误。
T’(x)/G(x)=(Q(x)×G(x)+R(x)+R(x))/G(x)=(Q(x)×G(x))/G(x)=Q(x)
若余数不为0,即T’(x)≠T(x),认为有错。
Ⅱ 计算机组成原理中,纯小数的模为什么是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运算
参考资料来源:网络-计算机组成原理
Ⅲ 用c语言实现模2算法,eg:10010001110000000除10011,求余数。
#include<stdio.h>
#include<string.h>
void Bin2Dec(int *bin, int *Dec, int num)
{
int i, j = 1;
*Dec = 0;
for(i = num - 1; i > -1; i--)
{
*Dec += bin[i] * j;
j *= 2;
}
}
void Dec2Bin(int *Bin, int Dec, int *num)
{
int i = 0;
while(1)
{
Bin[i++] = Dec % 2;
Dec /= 2;
if(!Dec)
break;
}
*num = i;
}
void main()
{
char bin[100];
int i, j, Bin[100], dividend, divider, remainder;
printf("Input a binary as dividend:\n");
gets(bin);
j = 0;
for(i = 0; i < strlen(bin); i++)
Bin[j++] = bin[i] - 48;
Bin2Dec(Bin, & dividend, i);
printf("Input a binary as divider:\n");
gets(bin);
j = 0;
for(i = 0; i < strlen(bin); i++)
Bin[j++] = bin[i] - 48;
Bin2Dec(Bin, & divider, i);
remainder = dividend % divider;
Dec2Bin(Bin, remainder, &i);
printf("The remainder: ");
for(j = i - 1; j > -1; j--)
printf("%d", Bin[j]);
printf("\n");
}
Ⅳ 模2除法的运算过程是怎么样的
被除数÷除数(4位二进制),从被除数高位起,取4位,>除数,商记为1;<除数,记为0。
怎么会4个O。因为上一位除数与被除数相等,相减差为3个0,本次除从被除数上拖1位下来,该位正好是0。
供参考
Ⅳ 二进制求余数(模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]='