笔者在阅读华中科技大学谭志虎老师主编的《计算机组成原理(微课版)》教材进行复习时,产生了一个疑问,并针对性地进行了一些思考。欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗,谁愿意寒假学习啊)&&CSDN博友针对我的疑问或想法进行批评讨论。
在编写本篇文章前,我参考了博主黎猫大侠的博客,链接放在下面。一道题带你搞懂CRC循环冗余校验是如何纠错的, 体会CRC的奇妙之处, 献给充满好奇心的你._黎猫大侠的博客-CSDN博客_crc纠错
这位博主的文章给我启发很大,感谢大虾0w0。但我在读完后仍然有一些问题。下面大概说一下我的想法:
作为循环冗余校验码,CRC的检错性能是大家有目共睹的。只要我们拿着带CRC码的信息去模2除以生成多项式,得到的余数不为0,我们便晓得是有错误出现了。
如果想要更加具体一点,知道哪位/哪几位错了,我们可以提前做一些计算工作,然后去查生成多项式对应的余数表格(类似于下图这种,实际应用中应该也能提前算出来)。如果数据信息比较短、选择的生成多项式比较好,比如(7,3)码的一些生成多项式,我们就可以利用提前搞出来的表格,顺利区分一位错和两位错,并在没有3位错的前提下检查出两位错和纠正一位错。
但是:对于CRC一位纠错性能的介绍,课本上语焉不详,只是说“可以利用CRC的编码特性设计组合逻辑电路来进行纠错”(“编码特性”是CRC的循环特性,也即:将余数左移一位除以生成多项式,得到下一个余数,再左移做除法得余数,重复这般操作,最后余数会循环变回自己。这一点在前文提及的博客里说得很详细,如果不知道可以跳转先去看看);网络上我搜集了一些资料,也只有前文博客在承认具有纠错功能的基础上讲述得比较详细(或许是我的信息检索能力比较差吧)。不过,基于前文博客的内容,我产生了一个疑惑,这里放一段博客里的话:

做个类比。假若我面对的是一个约定好的、稍微有些冷门的生成多项式,计算机咋就知道第一位出错的余数是啥(即上面情况中的101)?如果说,我已经在计算机里存储好了(或者手边就有)前文说的那种余数表,那我大可不必大费周章再来搞什么循环计算,直接查一下对应过去就完事了;如果我没有存这种余数表,那我还啥也不知道呢,(包括第一位出错的余数),我怎么就能晓得第一位出错的余数究竟是循环过程中的哪个呢?
(当然,现在看来思考这个问题的意义好像不大,因为没必要用冷门的生成多项式去实现一些功能,且CRC好像主要还是用来检错而不是纠错的)(之所以想这些才不是因为有一道作业题我写的答案很逆天,被分数gank了,尝试给自己找个台阶下呢QAQ)
我对这个问题的考虑是这样的:
先对一些定义或约定进行说明:
将原信息用一个信息多项式M(x)表示,其中Ci序列就是原来的数据信息,可以取0/1。
将M(x)左移r位,表示成
,这样就能在右侧空出r位放产生的CRC校验码。
用
按照 模2运算规则 除以 生成多项式G(x) ,得到的余数R(x)就是待填入的CRC校验码。
(注意:模2运算规则下加运算和减运算效果相同)
也就是说,最后得到的含CRC校验码的信息应该是: M(1)|R(1) (“|”表示把他俩连接起来)
我们有等式: (重要)
①
说一个猜想:这个例子中第一位错的时候余数是101;k=4,r=3,G(x)=1011。那么有没有这样一种可能,第一位错的余数与k、r、G(x)的取值直接相关,所以我们可以直接算出当前CRC约定下的第一位错的余数而不用拐着弯的去算余数表,并为后续利用循环特性完成的计算提供数据基础?(后面的证明如果有反例或者逻辑错误请速速联系我,主打一个光速耻辱删帖好吧)
道理还是比较简单的,就是写起来和表达起来有点繁琐。对于只有第一位出错而言,他只影响最高的信息位。记影响前M(x)的定义与前文相同,影响后M'(x)的定义为:
显然,与
的值 可以且仅可以 为1/0和0/1两种组合情况。而在模2运算下,加运算和减运算等效,因此我们有:
②
由等式①和等式②,我们作出如下叙述:(键盘敲太麻烦,写起来 2^{***} 跟 x^{***} 又写得挺混乱的,但意思应该能到吧,求谅解T T) (“?”就指代例子中我们在此处研究的“101”)

总结一下:
设第一位出错时的余数为'?',那么它的计算方法是:
这样,我们在拿到CRC生成的规则后,就可以找到一种行之有效的方法迅速推理出第一位出错时的余数是啥,而且是当前约定好的CRC生成规则(k、r、G(x)的取值固定)下“放之四海而皆准”的余数。一切问题也就迎刃而解。剩下的,如果想搞余数表,整个水落石出、明明白白,那就放手去做吧,搞余数表或者查现成的表;如果想好好体验一把“CRC循环特性”(雾),就可以祭出黎猫大侠的方法,体验就完事了。(虽然我感觉这种体验其实并不好,打表才是yyds)
因为我还没学完
(平时没听课,悲),所以上面的内容仅代表个人观点。希望上文对您有帮助!如果有纰漏疏忽的地方,敬请批评指正!如果有没讲明白的地方,欢迎评论留言!如果马上就要组原考试的话,祝你(也祝我)考个好成绩!另外,复习考试不要像我这个joker一样,对着一个不是考点的东西看起来没完,快要自学不完了(又悲)...
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at
如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta
Ruby中如何“一般地”计算以下格式(有根、无根)的JSON对象的数量?一般来说,我的意思是元素可能不同(例如“标题”被称为其他东西)。没有根:{[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]}根包裹:{"posts":[{"title":"Post1","body":"Hello!"},{"title":"Post2","body":"Goodbye!"}]} 最佳答案 首先,withoutroot代码不是有效的json格式。它将没有包
目标我正在尝试计算自给定日期以来周的距离,而无需跳过任何步骤。我更喜欢用普通的Ruby来做,但ActiveSupport无疑是一个可以接受的选择。我的代码我写了以下内容,这似乎可行,但对我来说似乎还有很长的路要走。require'date'DAYS_IN_WEEK=7.0defweeks_sincedate_stringdate=Date.parsedate_stringdays=Date.today-dateweeks=days/DAYS_IN_WEEKweeks.round2endweeks_since'2015-06-15'#=>32.57ActiveSupport的#weeks
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
如何计算两个字符串之间的字符交集?例如(假设我们有一个名为String.intersection的方法):"abc".intersection("ab")=2"hello".intersection("hallo")=4好的,男孩女孩们,感谢你们的大量反馈。更多示例:"aaa".intersection("a")=1"foo".intersection("bar")=0"abc".intersection("bc")=2"abc".intersection("ac")=2"abba".intersection("aa")=2一些补充说明:维基百科定义intersection如下:Int