循环冗余校验码(CRC)循环冗余校验码(CRC)的基本原理是: 在K位信息码后再拼接R位的校验码,循环冗余校验码怎么算循环冗余校验码的计算方法:编码原理:现假设有:有效信息:M,根据G(x)可以生成K位信息的校验码,通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码,校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,生成多项式样1011循环校验码解:有效信息1101(k=4),而G(x)叫做这个CRC码的生成多项式,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里。
循环冗余校验码(CRC)
循环冗余校验码(CRC)的基本原理是: 在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2R,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码。
循环冗余校验码怎么算
循环冗余校验码的计算方法:
编码原理:
现假设有:有效信息:M;
除数G(生成多项式)有:M/G=Q+R/G;
此时,可选择R作为校验位,则MR即为校验码。
校验原理:(M-R)/G=Q+0/G
说明:以接收到的校验码除以约定的除数,若余数为0,则可认为接收到的数据是正确的。
例:有效信息1101,生成多项式样1011
循环校验码解:
有效信息1101(k=4),即M(x)=x3+x2+x0,生成多项式1011(r+1=4,即r=3);
即G(x)=x3+x1+x0,M(x)·x3=x6+x5+x3,即1101000(对1101左移三位);
M(x)·x3/G(x)=1101000/1011=1111+001/1011 即1010的CRC是:1101001 。
计算图文如下 :
CRC(Cyclic Redundancy Check)循环冗余校验码,是常用的校验码,在早期的通信中运用广泛,因为早期的通信技术不够可靠(不可靠性的来源是通信技术决定的,比如电磁波通信时受雷电等因素的影响),不可靠的通信就会带来‘确认信息’的困惑,书上提到红军和蓝军通信联合进攻山下的敌军的例子,第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里,那自己不是很危险?于是红军再发一条‘对确认的确认信息’,但同样的问题还是不能解决,红军仍然不敢贸然行动。
循环队列
#include 《stdio.h》#include 《malloc.h》const int MAXSIZE = 100; //队列的最大长度 typedef int ElemType; //队列的数据类型 typedef struct queue { ElemType data[MAXSIZE]; //队列 int front; //队头的游标 int rear; //队尾的游标 }*Queue; Queue InitQueue() { //初始化队列Queue q = (struct queue *)malloc(sizeof(struct queue));q-》front = q-》rear = 0;return q;}int EnQueue(Queue q,ElemType e) { //让元素e进队if((q-》rear + 1) % MAXSIZE == q-》front) //队列已满return 0;q-》data[q-》rear] = e; //元素e进队q-》rear = (q-》rear + 1) % MAXSIZE; //游标rear上前进一位,如果已达最后,就移到前面return 1;}int DeQueue(Queue q,ElemType *e) { //队头的元素出队存入*eif(q-》rear == q-》front) //如果队列为空返回return 0;*e = q-》data[q-》front]; //返回队头的元素q-》front = (q-》front + 1) % MAXSIZE; //游标front向前移一位,如果是队列的末尾移动到最前面return 1;}int IsEmpty(Queue q) { //判断队列是否为空return (q-》front == q-》rear);}int isFull(Queue q) { //判断队列是否为满return (q-》rear + 1) % MAXSIZE == q-》front;}int GetQueueLength(Queue q) { //返回队列的长度return (q-》rear - q-》front + MAXSIZE) % MAXSIZE;}void Clear(Queue q) { //清空队列q-》front = q-》rear = 0;}void Print(Queue q) { //打印队列int i;if(q-》front == q-》rear) return; if(q-》rear 《 q-》front) {for(i = q-》front;i 《 MAXSIZE;++i) printf(“%d “,q-》data[i]);for(i = 0;i 《 q-》rear;++i) printf(“%d “,q-》data[i]);printf(“\n“);}else {for(int i = q-》front;i 《 q-》rear;++i)printf(“%d “,q-》data[i]);printf(“\n“);}}int main() {Queue q = InitQueue();for(int i = 1;i 《 20;++i) EnQueue(q,i);Print(q);int k;DeQueue(q,&k);EnQueue(q,30);Print(q);return 0; }
区分循环队列的满与空,只有两种方法,它们是______和______
区分循环队列的满与空,只有两种方法,它们是(牺牲一个存储单元)和(设标记)。
为充分利用向量空间,克服“假溢出“现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。
存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
扩展资料:
条件处理
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是“空“还是“满“。
解决这个问题的方法至少有两种:
1、另设一布尔变量以区别队列的空和满;
2、另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。