深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
⊕
D
3
⊕
D
4
=
0
P_3 = H_5 \oplus H_6 \oplus H_7 = D_2 \oplus D_3 \oplus D_4 = 0
P3=H5⊕H6⊕H7=D2⊕D3⊕D4=0, 这时候我们已经全部确定了海明校验码的值
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
D4 | D3 | D2 | P3 | D1 | P2 | P1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 |
3 ) 检错和纠错
- 怎么检测出错误呢?其实就是把各个分组内的这些二进制比特币进行一个异或运算, 也就是对这个分组进行偶校验
- 如果说这个分组内没有出错的话,那么进行异或运算得到的结果应该是0
- 如果现在接收方接收到的数据没有发生任何一个比特的错误,即:1010010,我们根据刚才确定的这三个分组对每个分组内的这些比特位依次进行异或运算
- 因为每个分组都有偶数个1,所以异或之后肯定都是000,这是没有出错的情况
- S
1
=
P
1
⊕
D
1
⊕
D
2
⊕
D
4
=
0
⊕
0
⊕
1
⊕
1
=
0
S_1 = P_1 \oplus D_1 \oplus D_2 \oplus D_4 = 0 \oplus 0 \oplus 1 \oplus 1 = 0
S1=P1⊕D1⊕D2⊕D4=0⊕0⊕1⊕1=0
- S
2
=
P
2
⊕
D
1
⊕
D
3
⊕
D
4
=
1
⊕
0
⊕
0
⊕
1
=
0
S_2 = P_2 \oplus D_1 \oplus D_3 \oplus D_4 = 1 \oplus 0 \oplus 0 \oplus 1 = 0
S2=P2⊕D1⊕D3⊕D4=1⊕0⊕0⊕1=0
- S
3
=
P
3
⊕
D
2
⊕
D
3
⊕
D
4
=
0
⊕
1
⊕
0
⊕
1
=
0
S_3 = P_3 \oplus D_2 \oplus D_3 \oplus D_4 = 0 \oplus 1 \oplus 0 \oplus 1 = 0
S3=P3⊕D2⊕D3⊕D4=0⊕1⊕0⊕1=0
- 如果说接收方接收到的数据为:1010000,H2这一位发生了错误,也就是P2这个校验位从1变成了0
- 第1个分组进行异或得到了0,第2个分组中由于P2发生了跳变,所以导致第2个分组中,现在只有奇数为1,那么异或出来的结果就是1
- 而第3个分组没有任何一个数据发生跳变,因此异或的结果应该是0
- S
1
=
P
1
⊕
D
1
⊕
D
2
⊕
D
4
=
0
⊕
0
⊕
1
⊕
1
=
0
S_1 = P_1 \oplus D_1 \oplus D_2 \oplus D_4 = 0 \oplus 0 \oplus 1 \oplus 1 = 0
S1=P1⊕D1⊕D2⊕D4=0⊕0⊕1⊕1=0
- S
2
=
P
2
⊕
D
1
⊕
D
3
⊕
D
4
=
0
⊕
0
⊕
0
⊕
1
=
1
S_2 = P_2 \oplus D_1 \oplus D_3 \oplus D_4 = 0 \oplus 0 \oplus 0 \oplus 1 = 1
S2=P2⊕D1⊕D3⊕D4=0⊕0⊕0⊕1=1
- S
3
=
P
3
⊕
D
2
⊕
D
3
⊕
D
4
=
0
⊕
1
⊕
0
⊕
1
=
0
S_3 = P_3 \oplus D_2 \oplus D_3 \oplus D_4 = 0 \oplus 1 \oplus 0 \oplus 1 = 0
S3=P3⊕D2⊕D3⊕D4=0⊕1⊕0⊕1=0
- 现在根据S1~S3组成的数就可以确定,是010这个位出现了错误,那010转换成10进制是2
- 也就是说S3S2S1所组成的这个二进制数指明了我们出错的位置在哪, 如果所得的结果110的话,那么就说明出错的位置是在6这个位置
- 这么神奇的规律背后是什么原理呢?如下图所示
- 这个图里边每一个圆圈表示的是从属于同一个分组的比特位
- P1、D1、D2、D4 从属于同一个分组
- P2、D1、D3、D4 从属于第2个分组
- P3、D2、D3、D4 从属于第3个分组
- 而这三个分组相互之间是有交集的,如果D3这个信息位发生了跳变,由于第2个分组和第3个分组都包含了D3这个信息位
- 因此D3的跳变会导致S2和S3算出来的结果都是1,而S1中所有的信息位都没有跳变,因此, 它出来的结果肯定是0
- 我们最终得到的S3~S1,结果是110, 这个数等于6刚好就指向了D3所对应的位置
- 再比如,假定了P2发生了跳变,那么P2它只从属于第2个分组,因此它只会影响S2的值,而得到的结果,010刚好又是指向了P2所处的位置
- 再举一个例子,如果说是D4发生了跳变,D4从属于所有的这些分组, 因此所有的分组的偶校验,或者说这个异或运算结果
- 肯定都会被影响的, 111对应的十进制是7, 刚好指向了D4它所处的这个位置,这就是海明码的一个纠错原理
海明码的格式变化
- 有时候,海明码的编号是从小到大,但是我们上面探讨的是从大到小
- 其实从小到大的做法是一模一样的,只不过是左右方向换了而已,在做法上没有任何区别
- 而另外一个要补充的具有一个比特位的纠错能力
海明码的缺点
- 海明码有1个比特位的纠错能力,有两个比特位的检错能力
- 这里有一个例子,假设我们在传输的过程当中,P1和P2这两个校验位发生了跳变,那么得到的结果就是S1=1, S2=1, S3=0
- 那么按照之前的规则011对应的十进制是3,那这是否说明了H3这个位置出现了错误呢?显然这个结论是不对的
- 此时我们是发生了两个比特位的跳变,我们是没有办法区分到底是一个比特位的错误,还是两个比特位的错误
- 为了解决这个问题实际海明码在使用的时候通常还会在最首部加上一个全校验位
- 所谓全校验就是对我们之前得到的全部的比特信息,统一的进行一次偶校验
- 在上述这个例子当中总共有三个1,所以这个全校验位,我们应该把它设定为1,保证整体来看有偶数个1
H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|
P全 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
- 如果我们求得的S1 ~ S3全部是0,并且全体的偶校验是成功的,那么就说明此时没有发生错误
- 如果S1~S3都不等于0。并且全体的偶校验失败,那么说明有移位的错误,我们只需要把它纠正就可以
1 ) 纠错场景1
- 比如P1发生了跳变,那么最终我们S1~S3应该是001也就是指向了1这个位置
- 由于P1这一个位发生了跳变就导致整体的偶校验失败的,此时H1这个位置发生了错误,我们只需要把它从1改为0就可以,不需要要求发送方重新发送这个数据
2 ) 纠错场景2
- 如果说有两个位发生了错误,就像刚才那个例子一样,P1、P2同时发生了错误, 那么S1~S3得到的结果应该是011
但这种情况下整体的偶校验是会成功的, 所以此时就说明是发生了两个比特位的错误,由于我们没有办法确定这两个比特位错在哪, 所以就需要要求对方重新传送这些数据
总结
概述
- 在所有的数据校验方式当中海明码是比较难理解的,但是如果我们从它的基本思想出发就能更方便的理解为什么海明码这么设计
- 本质上,它就是把所有的信息位进行分组,然后每一个组都进行偶校验,而每一个分组会对应一个校验位,所以如果有k个分组分组的话,自然就会有k个校验位
- 对于海明码的求解,首先需要确定校验位的位数,接下来需要确定各个校验位还有信息位的分布
- 那所有的这些校验位应该是分布在编号为1、2、4、8、16… 这些具有二进制位权重的位置
- 我们可以把这些校验位的位置信息理解为某一种权重, 这些权重信息可以帮助我们记忆和理解
- 当我们在进行分组的时候,这个分组规则是怎么制定的,每一个校验位所属的分组都应该确保他们拥有偶数的1
- 再进行检错纠错的时候,我们就可以根据各个分组是否满足拥有偶数个1这样的条件来判断哪些分组出现了问题
- 那根据各个分组偶校验的一个结果,我们就可以来判断到底是哪个位置出现了错误
- 关于海明码的纠错和检错能力,为了区分到底是一位错还是两位错,我们通常还会在最高位加上一个全校验位,保证海明码的整体有偶数个1
- 海明码这个知识点同时归属于计算机组成原理和计算机网络
结构树
- 海明码
- 基本思想
- 分组偶校验,多个校验位可反应出错位置
- 求解步骤
- 确定校验位个数(k个校验位,n个信息位)
2
k
≥
n
k
1
2^k \geq n+k+1
2k≥n+k+1
- 确定校验位分布
- P1、P2、P3 … 分别在 1, 2, 4, 8, 16 …
- 空出来的其他位置一次填入信息位
- 求校验位
- 将信息位的位置序号用k位二进制数表示出来
- 校验位 Pi 与 位置序号 第i位为1的信息位归为同一组, 进行偶校验
- 纠错
- 对P1,P2,P3…所属个分组进行异或(相当于分组偶校验), 求得 S1, S2, S3 …
- S3S2S1 = 000 说明无错误
- S3S2S1
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
海明码
- 基本思想
- 分组偶校验,多个校验位可反应出错位置
- 求解步骤
- 确定校验位个数(k个校验位,n个信息位)
2
k
≥
n
k
1
2^k \geq n+k+1
2k≥n+k+1
- 确定校验位分布
- P1、P2、P3 … 分别在 1, 2, 4, 8, 16 …
- 空出来的其他位置一次填入信息位
- 求校验位
- 将信息位的位置序号用k位二进制数表示出来
- 校验位 Pi 与 位置序号 第i位为1的信息位归为同一组, 进行偶校验
- 纠错
- 对P1,P2,P3…所属个分组进行异或(相当于分组偶校验), 求得 S1, S2, S3 …
- S3S2S1 = 000 说明无错误
- S3S2S1
[外链图片转存中…(img-bU3qY8nM-1715719521058)]
[外链图片转存中…(img-8RHblyVr-1715719521058)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!