#include <stdio.h>
#include <string.h>
// 转化后的二进制最多的位数
#define MAX_BIN_LENGHT 100
// 输入的表达式最多的字符数
#define MAX_EXP_LENGHT 100
// 根据表达式得到二进制数
void getBinary(char *express,int binary[MAX_BIN_LENGHT]);
// 根据两个二进制数,得到CRC校验结果
void getQuoRem(int *binaryY,int binaryG[MAX_BIN_LENGHT], int result[MAX_BIN_LENGHT]);
// 打印二进制数
void printBinary(int binary[MAX_BIN_LENGHT]);
// 得到正序的二进制数
void getOrderedBinary(int originalBinary[MAX_BIN_LENGHT],int orderedBinary[MAX_BIN_LENGHT]);
// 得到二进制位数
int getBinaryLength(int originalBinary[MAX_BIN_LENGHT]);
int main(int argc,char *argv[])
{
int binaryY[MAX_BIN_LENGHT]={0}; // 存放Y(x)转化后的二进制数
int binaryG[MAX_BIN_LENGHT]={0}; // 存放G(x)转化后的二进制数
int binaryTemp[MAX_BIN_LENGHT]={0}; // 存放表达式转化后的倒序二进制数
int binaryResult[MAX_BIN_LENGHT]={0}; // 存放最后要发送的加上校验码的数据
char express[MAX_EXP_LENGHT]; //存放输入的表达式
printf("请输入Y(x)表达式:\n");
scanf("%s",express);
getBinary(express,binaryTemp);
getOrderedBinary(binaryTemp,binaryY);
printf("请输入G(x)表达式:\n");
scanf("%s",express);
getBinary(express,binaryTemp);
getOrderedBinary(binaryTemp,binaryG);
// 得到有校验码的数据
getQuoRem(binaryY,binaryG,binaryResult);
printf("\nY(x)的二进制为:");
printBinary(binaryY);
printf("G(x)的二进制为:");
printBinary(binaryG);
printf("最终的CRC校验数据为:");
printBinary(binaryResult);
return 0;
}
/**********************
* 根据表达式得到二进制数
***********************/
void getBinary(char *express,int binary[MAX_BIN_LENGHT])
{
int i;
int num=0;
char tempc;
// 让binary清零
for(i=0;i<MAX_BIN_LENGHT;i++)
{
binary[i]=0;
}
// 求倒序的二进制
for(i=0;i<strlen(express);)
{
if(*(express+i)=='^')
{
// 如果是^号,表示接下来的就是指数了
for(i=i+1;i<strlen(express);i++)
{
tempc=*(express+i);
if(tempc>='0' && tempc<='9')
{
num=num*10+(tempc-'0');
if((i+1)>=strlen(express))
{
binary[num]=1;
}
}
else
{
/*
得到相应的指数,将对应的二进制位数设置为1。
此时二进制的最低位对应的是binary[0],二进制的最高位对应的是binary[MAX_BIN_LENGHT-1]
*/
binary[num]=1;
num=0;
break;
}
}
}
else
{
if(*(express+i)=='1'&& (i+1)>=strlen(express))
{
// 如果最后一个数字是1,那么二进制最低位binary[0]设置为1
binary[0]=1;
}
i++;
}
}
}
/**************************
* 根据两个二进制数,得到CRC校验结果
* 参数: binaryY 二进制被除数
* binaryG 二进制除数
* quotient 商
* remainder 余数
* result 带校验码的最终结果
**************************/
void getQuoRem(int binaryY[MAX_BIN_LENGHT],int binaryG[MAX_BIN_LENGHT],int result[MAX_BIN_LENGHT])
{
int i,j,index=0,k;
int lengthY,lengthG,lengthB;
int quotient[MAX_BIN_LENGHT]={0}; // 存放商的二进制数
int remainder[MAX_BIN_LENGHT]={0}; // 存放余数的二进制数
lengthY=getBinaryLength(binaryY);
lengthG=getBinaryLength(binaryG);
if(lengthG>lengthY)
{
printf("除数比余数大!无法得到正确商和余数!");
quotient[1]=-1;
remainder[1]=-1;
return ;
}
/*
* 将被除数的后边加上除数对应的0,结果存入到result中。
* 添加的0的个数与除数中x^n的最大指数值n相同
*/
for(i=0;i<(lengthY+lengthG-1);i++)
{
// 最终的结果前面与被除数相同
if(i<lengthY)
{
result[i]=binaryY[i];
}
// 最终结果的后面填充相应个数的0
else
{
result[i]=0;
}
}
// result尾部加上结束符
result[i]=-1;
// 得到被除数总的位数长度
lengthB=getBinaryLength(result);
// 先得到最开始的余数
for(i=0;i<lengthG;i++)
{
remainder[i]=result[i];
}
// 循环得到商和余数
for(i=lengthG-1;i<lengthB;i++)
{
if(remainder[0]==1)
{
// 商1
quotient[index]=1;
// remainder余数与除数按位异或,结果存remainder余数中
for(j=0;j<lengthG;j++)
{
if(remainder[j]==binaryG[j])
{
remainder[j]=0;
}
else
{
remainder[j]=1;
}
}
}
else
{
// 商0
quotient[index]=0;
// 商0的话,remainder余数与全0按位异或,余数结果是不变的
}
index++;
// 舍弃余数最高位,后边的依次前移1位
for(j=1;j<lengthG;j++)
{
remainder[j-1]=remainder[j];
}
// 将被除数的下一位数字加到余数的最低位处,这样就可以进行下一次的除法
if((i+1)<lengthB)
{
remainder[lengthG-1]=result[i+1];
}
}
// 循环结束,将商和余数的数组末尾加上结束符号
remainder[lengthG-1]=-1;
quotient[index]=-1;
/*
printf("商为:");
printBinary(quotient);
printf("余数为:");
printBinary(remainder);
*/
// 将被除数后面的0换成相应的余数,这样被除数就变成要发送的带校验码的数据
for(i=lengthY;i<(lengthY+lengthG-1);i++)
{
result[i]=remainder[i-lengthY];
}
}
/**************************
* 打印二进制数
**************************/
void printBinary(int binary[MAX_BIN_LENGHT])
{
int i;
for(i=0;i<getBinaryLength(binary);i++)
{
printf("%d",binary[i]);
}
printf("\n");
}
/**************************
* 得到正序的二进制数
**************************/
void getOrderedBinary(int originalBinary[MAX_BIN_LENGHT],int orderedBinary[MAX_BIN_LENGHT])
{
/*
*因为originalBinary数组中originalBinary[0]存放的是二进制的最低位,originalBinary[MAX_BIN_LENGHT-1]存放的是二进制的最高位,
*将数组倒序后存放到orderedBinary中
*/
int i;
int j=0;
for(i=MAX_BIN_LENGHT-1;i>=0;i--)
{
if(originalBinary[i]==1)
{
for(j=0;i>=0;i--)
{
orderedBinary[j]=originalBinary[i];
j++;
}
}
else if(i==0)
{
orderedBinary[j]=originalBinary[i];
j++;
}
}
// 设置结束标志
orderedBinary[j]=-1;
}
/**************************
* 得到二进制位数
**************************/
int getBinaryLength(int binary[MAX_BIN_LENGHT])
{
int i;
for(i=0;i<MAX_BIN_LENGHT;i++)
{
if(binary[i]==-1)
{
break;
}
}
return i;
}
/*-----------------------------测试结果------------------------------*/
请输入Y(x)表达式:
x^5+x^3+1
请输入G(x)表达式:
x^3+x^2+1
Y(x)的二进制为:101001
G(x)的二进制为:1101
最终的CRC校验数据为:101001001
分享到:
相关推荐
2025职业教育知识竞赛题库(含答案).pptx
基于.NET Core MVC与SQL Server的在线考试管理系统:多角色操作、国际化支持、全套源码与文档附赠,.net core mvc在线考试系统 asp.net在线考试管理系统 主要技术: 基于.net core mvc架构和sql server数据库,数据库访问采用EF core code first,前端采用vue.js和bootstrap。 功能模块: 系统包括前台和后台两个部分,分三种角色登录。 管理员登录后台,拥有科目管理,题库管理,考试管理,成绩管理,用户管理等功能。 教师登录后台,可进行题库管理,考试管理和成绩管理。 用户登录前台,可查看考试列表,参加考试,查看已考试的结果,修改密码等。 系统实现了国际化,支持中英两种语言。 源码打包: 包含全套源码,数据库文件,需求分析和代码说明文档。 运行环境: 运行需vs2019或者以上版本,sql server2012或者以上版本。 ,核心关键词: .net core mvc; asp.net在线考试管理系统; SQL Server数据库; EF core code first; vue.js; boot
C++编写的资产管理系统(带SQLServer数据库文件。)。
递归最小二乘法在线识别轮胎前后侧偏刚度:应用sin工况效果显著,适用多种场景,附simulink模型及代码,1、基于递归最小二乘法在线识别轮胎前后侧偏刚度,图为在正弦曲线工况,估计侧偏刚度的大小,效果较好 2、此模型也可用于其他工况下的刚度估计,有需要的朋友可以自行去尝试 3、包含simulink模型和递归最小二乘侧偏刚度估计代码 ,基于递归最小二乘法; 轮胎侧偏刚度在线识别; 正弦曲线工况估计; Simulink模型; 递归最小二乘侧偏刚度估计代码。,递归最小二乘法在正弦曲线工况下的轮胎刚度在线识别模型
PLL锁相环技术实现:SMIC55工艺下20MHz参考频率三阶二型CPPLL,快速锁定至1GMHz并带环形振荡器与DIV模块功能,pll锁相环 cppll cadence 三阶二型锁相环 工艺smic55 参考频率20MHz 分频比50 锁定频率1GMHz 锁定时间2us 环形振荡器 ring vco PFD模块 DIV模块 45分频,ps counter CP模块 工艺smic55 ,核心关键词:PLL锁相环; CPPLL; 工艺SMIC55; 参考频率20MHz; 分频比50; 锁定频率1GHz; 锁定时间2us; 环形振荡器(Ring VCO); PFD模块; DIV模块(45分频,ps counter); CP模块。,"SMIC55工艺:PLL环及二型锁相环技术解析"
EKF SLAM matlab simulation. EKF SLAM 分析及matlab仿真源码。
CPRI IP License支持Xilinx Vivado全版本,无MAC绑定,永久有效授权,CPRI ip license xilinx vivado 支持Vivado各版本,不绑定mac,永久有效 ,CPRI; IP license; Xilinx; Vivado; 不绑定Mac; 永久有效; 支持各版本。,"Xilinx Vivado支持:永久有效的CPRI IP License,不绑定MAC"
1.内容概要 通过KNN实现鸢尾花分类,即将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别。 2.KNN算法的伪代码 对未知类别属性的数据集中的每个点依次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离; (2)按照距离递增次序排序; (3)选取与当前点距离最小的k个点; (4)确定前k个点所在类别的出现频率; (5)返回前k个点出现频率最高的类别作为当前点的预测分类。 3.数据集说明 代码使用`pandas`库加载了一个名为`iris.arff.csv`的数据集 4.学习到的知识 通过鸢尾花分类学习了KNN算法,选择样本数据集中前k个最相似的数据,就是KNN算法中k的出处。k值过大,会出现分类结果模糊的情况;k值较小,那么预测的标签比较容易受到样本的影响。在实验过程中,不同的k值也会导致分类器的错误率不同。KNN算法精度高、无数据输入的假定,可以免去训练过程。但是对于数据量较多的训练样本,KNN必须保存全部数据集,可能会存在计算的时间复杂度、空间复杂度高的情况,存在维数灾难问
COMSOL三维采空区通风条件下的氧气与瓦斯浓度分布研究,comsol三维采空区通风条件下,氧气,瓦斯浓度分布。 ,核心关键词:comsol; 三维采空区; 通风条件; 氧气浓度分布; 瓦斯浓度分布;,"三维采空区通风模拟:氧气与瓦斯浓度分布研究"
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
DaisyDisk for Mac是一款直观且强大的磁盘清理工具,专为Mac用户设计。它通过交互式图表直观展示磁盘空间使用情况,以彩色区块形式呈现文件和文件夹大小,帮助用户快速定位占用空间的大文件。软件支持快速扫描,可在几秒内完成磁盘分析,并提供文件预览功能,避免误删重要文件。DaisyDisk还支持多磁盘管理、云存储扫描、隐私保护和安全删除功能。其界面简洁易用,适合新手和专业人士,是优化磁盘空间、提升系统性能的必备工具。
三菱FX3U伺服控制框架标准程序详解:定位控制参数设定、回原点操作、JOG手动控制及绝对与相对定位控制,FX3U和三菱伺服控制的框架标准程序,适合新手学习定位用。 用 标签分层,说明了定位控制中的公共参数设定、回原点、JOG手动、绝对定位、相对定位、控制等部分,有伺服驱动器的针脚接线。 ‘包括有: 1、程序一份 2、说明一份 ,核心关键词:FX3U; 三菱伺服控制; 框架标准程序; 新手学习定位; 标签分层; 公共参数设定; 回原点; JOG手动; 绝对定位; 相对定位; 控制; 伺服驱动器针脚接线。,"三菱FX3U伺服控制框架标准程序:新手定位控制指南"
Python自动化办公源码-40 excel处理实例(多工作表合并到单工作表)
2023-04-06-项目笔记-第三百八十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.384局变量的作用域_384- 2025-01-22
基于MATLAB的含风光柴储微网多目标优化调度策略与模型实现,含风光柴储微网多目标优化调度 MATLAB代码 关键词:微网调度 风光柴储 粒子群算法 多目标优化 参考文档:《基于多目标粒子群算法的微电网优化调度》 仿真平台:MATLAB 平台采用粒子群实现求解 优势:代码注释详实,适合参考学习,非目前烂大街的版本,程序非常精品,请仔细辨识 主要内容:代码构建了含风机、光伏、柴油发电机以及储能电站在内的微网优化运行模型,并且考虑与上级电网的购电交易,综合考虑了多方经济成本以及风光新能源消纳等多方面的因素,从而实现微网系统的经济运行,求解采用的是MOPSO算法(多目标粒子群算法),求解效果极佳,具体可以看图 ,关键词:微网优化调度; 风光柴储; 粒子群算法; 多目标优化; MATLAB代码; MOPSO算法。,基于MATLAB的微网风光柴储多目标优化调度与MOPSO算法的实践研究
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
西门子SMART 200电机控制子程序V1.6:智能管理多达7个电机,灵活设置运行参数,故障自动切换备用电机,版本升级持续优化。,西门子SMART 200 电机控制子程序V1.6,可生成库 可控制1-7个电机 可设置同时运行的最大电机数量 可设置每个电机是否使用 可设置电机轮时间,当系统单次运行时间>轮时间,停止运行时间最长的电机,上累计运行时间最短的电机 可设置电机启动间隔 每次启动累计运行时间最短的电机 当有电机故障时,立即停止该电机,如果有备用电机自动切备用电机 7个电机内,可自由设置备用电机个数,使用的电机总数-最大电机数量=备用电机个数 附版本升级记录: V1.1优化:当使能被关闭后自动关闭对应电机 V1.2优化:运行中改变同时使用电机数量有效 V1.3更改:open信号上升沿直接启动1个电机(跳过启动间隔),第二个电机启动间隔才有效 轮时间改为秒,当系统单次运行时间>轮时间,停止运行时间最长的电机,上累计运行时间最短的电机 V1.4优化 V1.5满足可以运行的电机数量>同时使用电机数量 时 轮才有效,不满足时,轮计时清零 V1.6 优化某些情况下,无法正确延时 ,核心关键词
点击查看,完整项目演示视频,更有数百个深度学习项目案例:zzgcz.com 项目A030-DIN的核心是通过深度学习技术实现个性化推荐算法,旨在为用户提供精准、高效的商品或内容推荐。在现代电子商务、社交媒体及内容平台中,推荐系统作为核心功能,极大地提升了用户体验。DIN(Deep Interest Network,深度兴趣网络)是一种专门针对用户行为数据进行建模的深度学习模型,通过捕捉用户历史行为中的兴趣点,动态地生成推荐结果。DIN模型的一个显著特点是,它能够根据用户的当前兴趣动态调整推荐内容,不仅仅是依赖于用户的全局行为历史。
基于PID控制的超车轨迹跟踪技术:高效跟踪期望轨迹的详细指南,基于pid控制的超车轨迹跟踪,能够很好的跟踪期望轨迹。 有详细的说明文档 ,基于pid控制的超车轨迹跟踪; 轨迹跟踪; 精确性; 详细说明文档。,基于PID控制的超车轨迹精确跟踪技术:高效追踪期望轨迹的说明文档