转载:从小白鼠试毒问题-海明码

2024-09-05 20:58

本文主要是介绍转载:从小白鼠试毒问题-海明码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题提出:

有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出哪瓶水有毒?

问题分析:

需要多少只小白鼠?这个很容易想到是10只(二进制),但是如何鉴别哪一瓶水有毒?(即如何安排小白鼠?)原贴如下:https://blog.csdn.net/mengtnt/article/details/8477747

海明码计算:

转载:http://www.360doc.com/content/19/0625/00/64945951_844646164.shtml

海明码是一种多重奇偶检错系统,它具有检错和纠错的功能。海明码中的全部传输码字是由原来的信息和附加的奇偶校验位组成的。每一个这种奇偶校验位和信息位被编在传输码字的特定位置上。这种系统组合方式能找出错误出现的位置,无论是原有信息位,还是附加校验位。

设海明码校验位为k,信息位为m,则它们之间的关系应满足m+k+1≤2的k次方。

下面以原始信息101101为例,讲解海明码的推导与校验过程。

(1)确定海明码校验位长
m是信息位长,则m=6 。根据上述关系式m+k+1≤2的k次方,得到7+k≤2的k次方。解得最小k为4,即校验位为4。信息位加校验位总长度为10位。

(2)推导海明码

1.填写原始信息。

从理论上讲,海明码校验位可以放在任何位置,但习惯上校验位被从左到右安排在1、2、4、8、...的位置上。原始信息则从左至右填入剩下的位置。如图1所示,校验位处于B1、B2、B4、B8位,剩下位为信息位,信息位依从左至右的顺序先行填写完毕。

图1 填入原始信息位

2.计算校验位。

依据公式得到校验位:

P1=B3⊕B5⊕B7⊕B9=1⊕0⊕1⊕0=0 P2=B3⊕B6⊕B7⊕B10=1⊕1⊕1⊕1=0 P3=B5⊕B6⊕B7=0⊕1⊕1=0 P4=B9⊕B10=1⊕1=0

注:⊕表示异或运算。
这个公式常用,但是死记硬背很困难,要换个方式去理解记忆。
把除去1、2、4、8(校验位位置值编号)之外的3、5、6、7、9、10这些值转换为二进制位,如表1所示。

将所有信息编号的二进制的第1位为1的Bi进行“异或”操作,结果填入P1。即上述的结果P1=B3⊕B5⊕B7⊕B9=1⊕0⊕1⊕0=0;

同理,将所有信息编号的二进制的第2位为1的Bi进行“异或”操作,结果填入P2。即上述结果P2=B3⊕B6⊕B7⊕B10=1⊕1⊕1⊕1=0;

以此类推,将所有信息编号的二进制的第3位为1的Bi进行“异或”操作,结果填入P3;将所有信息编号的二进制的第4位为1的Bi进行“异或”操作,结果填入P4。

将计算好的结果,填入校验位后得到图2。
              
图2 加入校验码后的信息

(3).校验

将所有信息位位置编号1~10的值转换为二进制位,如表2所示。

表2 十进制与二进制转换表

将所有信息编号的二进制的第1位为1的Bi进行“异或”操作,得到X1;
将所有信息编号的二进制的第2位为1的Bi进行“异或”操作,得到X2;
将所有信息编号的二进制的第3位为1的Bi进行“异或”操作,得到X4;
将所有信息编号的二进制的第4位为1的Bi进行“异或”操作,得到X8。
即公式:

X1=B1⊕B3⊕B5⊕B7⊕B9 X2=B2⊕B3⊕B6⊕B7⊕B10 X4=B4⊕B5⊕B6⊕B7 X8=B8⊕B9⊕B10

得到一个形式为X8X4X2X1的二进制,转换为十进制,结果为0,则无错;结果非0(假设结果为Y),则错误发生在第Y位。

假设起始端发送加了上述校验码信息之后(即0010011101),目的端收到的信息为0010111101,如图3所示。    

 
                                    
图3 接收信息

依据上一个公式,得到:

X1=B1⊕B3⊕B5⊕B7⊕B9=0⊕1⊕1⊕1⊕0=1 X2=B2⊕B3⊕B6⊕B7⊕B10=0⊕1⊕1⊕1⊕1=0 X4=B4⊕B5⊕B6⊕B7=0⊕1⊕1⊕1=1 X8=B8⊕B9⊕B10=1⊕0⊕1=0

则将X8X4X2X1=0101的二进制转换为十进制,结果为5,非0,错误,而且错误发生在第5位。

这篇关于转载:从小白鼠试毒问题-海明码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1140051

相关文章

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

Java中InputStream重复使用问题的几种解决方案

《Java中InputStream重复使用问题的几种解决方案》在Java开发中,InputStream是用于读取字节流的类,在许多场景下,我们可能需要重复读取InputStream中的数据,这篇文章主... 目录前言1. 使用mark()和reset()方法(适用于支持标记的流)2. 将流内容缓存到字节数组

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe