⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tt.c

📁 计算xk+1除CRC-CCITT后的余式
💻 C
字号:
//crc32.c
#include "stdlib.h" 
#include "string.h" 
#include "stdio.h" 
 
void main() 
{  	
int rlt[33]; 	
//char c; 	
bool flag=0; 
 	
//结果数组初始化 	
for(int i=0; i<33; i++) 		
rlt[i]=0; 

//CRC-32 = X32 + X26 + X23 + X22 + X16 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + X0
//CRC_32 = 0x04C10DB7,生成多项式的最高幂次项系数是固定的1,04C11DB7实际上是104C11DB7	
char crc32[33]={1,              
0, 0, 0, 0,              
0, 1, 0, 0,              
1, 1, 0, 0,             
0, 0, 0, 1,             
0, 0, 0, 0,             
1, 1, 0, 1,             
1, 0, 1, 1,             
0, 1, 1, 1}; 

//这个是X^K+1     
for(unsigned int k=1;k<=32768;k++)
{     	         
char *bcs = new char[k + 1 + 32];         
//char *s = new char[k + 1 + 32]; 
//原型:extern void *memset(void *buffer, int c, int count);
//功能:把buffer所指内存区域的前count个字节设置成字符c;
//说明:返回指向buffer的指针.       
memset(bcs, 0, sizeof(char)*(k + 1+32));         
//memset(s, 0, sizeof(char)*(k + 1+32));         
bcs[0] = 1;         
bcs[k] = 1; 		
//flag = 0; 
 		
//计算余式,余式按高位到低位的顺序存储在bcs[k]……bcs[k+32]中         
unsigned int q = 0;         
int zjw = 0;         
while (q <= k + 1 - 33 + 32)     	
{             
int i = 0;             
if (zjw == 0)                 
for (i = 0; i <= 32; i++)                     
if (bcs[i + q] > crc32[i])             			
break;             		
else                     
if (bcs[i + q] < crc32[i])         			
{                 		
i = 33;             			
break;         			
}             
if (i <= 32)     		
{             	
zjw = 0;                 
//s[q + 32] = 1;                  
for (i = 32; i >= 0; i--)         		
{                     
if ((bcs[i + q] == 1 && crc32[i] == 1) ||                         
(bcs[i + q] == 0 && crc32[i] == 0))                         
bcs[i + q] = 0;                     
else 
bcs[i + q] = 1;          		
}     		
}         	
else      		
{                 
zjw = bcs[q];     		
}         	
q++;     	
} 
 		
//确定余式的最高位数 		
int j=k,cnt=0; 		
while(bcs[j]==0) 		
{	
j++; 			
if(cnt==32){	
//能够整除的情况不统计在内 				
flag = 1; 				
break; 			
} 			
cnt++; 		
}  		
//在每次循环内更新结果 		
if(flag==0) 			
rlt[32-cnt]++;  		
free(bcs); 		
//free(s);     
} 
	 	
//输出最终结果 	
for(i=0; i<=32; i++) 		
printf("最高%2d次:%6d个\n",i,rlt[i]); 	
//scanf(&c); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -