资源描述:
《计算余数的二进制除法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、计算余数的二进制除法(异或)第一步:要在数据位(被除数)后边补0,0的个数比除数(生成多项式)少一位。第二步:做除法(异或操作),从被除数的头五位减去五位的除数。除数的每一位都与被除数的对应位在不涉及上一位的情况下独立进行减法(实际进行的是模2加)。在本例中,除数11001与被除数的前五位10110进行的是模2加,得到1111(余数1前面的0被省略)。在被除数中下一个没有使用过的比特接着被抄录下来,使得余数的位数和除数的位数相同。如果位数不够,在商位补0(这与一般除法相同),因此,下一步就是11110^11001,结果是111,依次类推。在二进制除法中,除数总是以
2、1开头的,然后从上一次的被除数/余数中与除数位数相同的部分中减去除数,并且只能从最左位是1的被除数/余数中减去除数。每当被除数/余数的最左位是0时,就在该步骤中把0丢弃,再把被除数中的下一个未使用比特抄录下来填充余数,同时对应的商数位补一个零,并按上述方法进行二进制除法运算,一直重复这个过程直到被除数中所有比特都被使用过。余数100只有3位,而余数应为4位(比除数少一位),因此,取校验码时应在前面填一个0,故其CRC校验码应为0100,于是可求出该信息码的循环冗余码为101100110100。为了判断传输的正确性,在接收端要有一个CRC校验器。它的功能和发生器一样
3、,当收到CRC冗余校验码后,做同样的模2除法(注意,这里采用的生成多项式一定要与发送端相同)。如果余数是全0,则说明传输正确;否则,传输错误,应重传。【itoa函数可以将整型数字转为二进制字符串】1#include2#include3#include4charres[33];5unsignedintdata,g,a[33]={0,60x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,0x00000080,7
4、0x00000100,0x00000200,0x00000400,0x00000800,0x00001000,0x00002000,0x00004000,0x00008000,80x00010000,0x00020000,0x00040000,0x00080000,0x00100000,0x00200000,0x00400000,0x00800000,90x01000000,0x02000000,0x04000000,0x08000000,0x10000000,0x20000000,0x40000000,0x8000000010};11unsignedintstr
5、_int(unsignedint*d)12{13unsignedinti=0,t=0;14charstr[40];15scanf("%s",str);16while(str[i]!=' '){17t<<=1;18t
6、=str[i]-48;19i++;20}21*d=t;22returni;23}24unsignedintGetData(unsignedinti){returndata&a[32-i+1]?1:0;}25intmain()26{27unsignedintl1,l2,l3,r,i,cas;28printf("预处理多少条传送数据?");29sca
7、nf("%d",&cas);30while(cas--){31//读取待传送数据k位32printf("输入待传送数据M(不高于32位):");33l1=str_int(&data);34//读取除数n位35printf("输入除数p(不高于%d位):",32-l1+1);36l2=str_int(&g);37//将待传送数据右移n-1位38data<<=(l2-1);39l1+=(l2-1);40//模2除求余数41r=0;i=32-l1+1;42while(i<=32){43r<<=1;44r
8、=GetData(i);45if(r>=a[l2])r^=g;46
9、i++;47}48//输出结果49data>>=(l2-1);50printf("发送帧:%s",itoa(data,res,2));51itoa(r,res,2);52l3=strlen(res);53for(i=l3;i