汉明码(Hamming Code)原理及实现

2023-05-16

汉明码(Hamming Code)原理及实现

汉明码实现原理

汉明码(Hamming Code)是广泛用于内存和磁盘纠错的编码。汉明码不仅可以用来检测转移数据时发生的错误,还可以用来修正错误。(要注意的是,汉明码只能发现和修正一位错误,对于两位或者两位以上的错误无法正确和发现)。

设将要进行检测的二进制代码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k位的代码。那么,新增加的检测位数k应满足:

2 k − 1 ≥ n + k 2^k-1\geq n+k 2k1n+k

这就是Hamming不等式,汉明吗规定,我们所得到的m位编码 2 k ( k ≥ 0 ∣ 2 k &lt; n + k ) 2^k(k\geq0\mid 2^k&lt;n+k) 2k(k02k<n+k)位上插入特殊的校验码,其余位把源码按顺序放置。

汉明码的编码规则如下:

  • 在新的编码的2^(k-1)(k >= 0)位上填入0(即校验位)
  • 把新的编码的其余位把源码按原顺序填入
  • 校验位的编码方式为:第k位校验码从则从新的编码的第2^(k - 1)位开始,每计算2^(k - 1)位的异或,跳2^(k - 1)位,再计算下一组2^(k - 1)位的异或,填入2^(k - 1)位,比如:
    第1位校验码位于新的编码的第1位(2 ^(1-1) == 1)(汉明码从1位开始),计算1,3,5,7,9,11,13,15,…位的异或,填入新的编码的第1位。
    第2位校验码位于新的编码的第2位(2 ^(2-1) == 2),计算2,3,6,7,10,11,14,15,…位的异或,填入新的编码的第2位。
    第3位校验码位于新的编码的第4位(2 ^(3-1) == 4),计算4,5,6,7,12,13,14,15,20,21,22,23,…位的异或,填入新的编码的第4位。
    第4位校验码位于新的编码的第8位(2 ^(4-1) == 8),计算8-15,24-31,40-47,…位的异或,填入新的编码的第8位。
    第5位校验码位于新的编码的第16位(2 ^(5-1) == 16),计算16-31,48-63,80-95,…位的异或,填入新的编码的第16位。
汉明码编码实例

以10101编码为例,创建一个汉明码编码的空间,并且把源码填入编码的对应位中中,_ _ 1 _ 0 10 _ 1,并留出校验码位(校验位先设为0)。(因为2^4 - 1>= 5+4 && 2^3 - 1 < 5+ 3所以需要4位校验码)

  • 计算校验码的第1位(1,3,5,7,9进行异或): 结果为0,所以汉明码第2^0位为0,结果为0 _ 1 _ 0 10 _ 1
  • 计算校验码的第2位(2,3,6,7进行异或): 结果为0,所以汉明码第2^1位为0,结果为001 _ 0 10 _ 1
  • 计算校验码的第3位(4,5,6,7进行异或): 结果为1,所以汉明码第2^2位为0,结果为0011 0 10 _ 1
  • 计算校验码的第4位(8, 9进行异或): 结果为0,所以汉明码第2^3位为1,结果为0011 0101 1
  • 所以最终编码为001101011.
汉明码校验错误实例

我们以上面的编码为例,假设我们现在收到的编码为001101001,我们可以发现汉明码的第8位与原来的汉明码001101011不同,那我们怎么找出这个第8位的错误编码呢?

算法很简单,我们只要在算汉明码校验位的算法的上再算一遍,就得到了汉明码的校验方法,比如计算001101001对应的2^k位。

1,3,5,7,9进行异或,得到0
2,3,6,7进行异或,得到0
4,5,6,7进行异或,得到0
8,9进行异或,得到1

我们把上述结果反着排列,得到1000,即十进制的8,根据汉明码的校验规则,编码出错的地方即在第8位,我们把第8位的0换成1,即可得原来的编码001101011。

上述的例子是出现在2k的校验位上的,如果出现在非2k位上,得到的结果也是一样的,比如:
假设收到的编码为001100011,即第6位出了错误,我们根据规则

1,3,5,7,9进行异或,得到0
2,3,6,7进行异或,得到1
4,5,6,7进行异或,得到1
8,9进行异或,得到0

我们把上述结果反着排列,得到0110,即十进制的6,根据汉明码的校验规则,编码出错的地方即在第6位,我们把第6位的0换成1,即可得原来的编码001101011。

汉明码的编码和校验的C++实现

通过原理,我们可以和简单地实现汉明码的编码和校验代码
编码:

auto cal(size_t sz)->decltype(auto)
{
    decltype(sz) k = 0;
    decltype(sz) cur = 1;
    while (cur - 1 < sz + k )
    {
        cur <<= 1;
        k++;
    }   
    return k;
}

bool encode(const string &s, string &d)
{
    d.clear();
    auto k = cal(s.size());
    d.resize(s.size() + k);
    for (decltype(d.size()) i = 0, j = 0, p = 0; i!= d.size();i++)
    {
        if ((i + 1) == pow(2,p) && p < k)
        {
            d[i] = '0';
            p++;
        }
        else if (s[j] == '0' || s[j] == '1')
            d[i] = s[j++];
        else 
            return false;
    }
    for (auto i = 0; i != k;i++)
    {
        int count = 0 ,index = 1 << i;
        for (auto j = index - 1; j < d.size() ;j += index)
            for (auto k = 0; k!= index && j < d.size(); k++, j++)
                count ^= d[j] - '0';
        d[index - 1] = '0' + count;
    }
    return true;
}

解码与校验:

auto antiCal(size_t sz)->decltype(auto)
{
    decltype(sz) k = 0;
    decltype(sz) cur = 1;
    while (cur < sz)
    {
        cur <<= 1;
        k++;
    }   
    return k;
}

auto decode(string &s, string &d)->decltype(auto)
{
    s.clear();
    auto k = antiCal(d.size());
    s.resize(d.size() - k);

    decltype(d.size()) sum = 0;
    for (decltype(k) p = 0;p != k;p++)
    {
        int pAnti = 0;
        decltype(k) index = 1 << p;
        for (decltype(d.size()) i = index - 1;i < d.size(); i+=index)
        {
            for (auto j = 0; j < index && i < d.size(); i++, j++)
                pAnti ^= d[i] - '0';
        }
        sum += pAnti << p;
    }
    if (sum != 0)
        d[sum - 1] = (1- (int)(d[sum - 1] - '0')) + '0';

    for (decltype(d.size()) i = 0, p = 0,j = 0; i != d.size(); i++)
    {
        if ((i + 1) == (1 << p) && p < k)
            p++;
        else
            s[j++] = d[i];
    }

    return sum;
}

测试样例:

int main()
{
    string source, dest;
    while (cin >> source)
    {
        if (encode(source,dest))
        {
            cout << "Source: " <<source << endl;
            cout << "Dest: " << dest << endl;
        }
        size_t index;
        cout << "----input error index : ";
        cin >> index;
        auto k = dest.size();
        if (index != 0 && index <= dest.size())
            dest[index - 1] = (1 - (int)(dest[index - 1] - '0')) + '0';
        cout << "Code " << dest <<endl;
        auto ret = decode(source,dest);
        if (ret == 0)
        {
            cout << "Source: " <<source << endl;
            cout << "Dest: " <<dest << endl;
        }   
        else
        {
            cout << "Error index "<< ret  << endl;
            cout << "Corret source: " <<source << endl;
            cout << "Corret dest: " <<dest << endl;
        }
        cout << endl;
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汉明码(Hamming Code)原理及实现 的相关文章

  • 【滤波】离散贝叶斯滤波器

    本文参考自rlabbe Kalman and Bayesian Filters in Python的第2章节02 Discrete Bayes xff08 离散贝叶斯 xff09 span class token operator span
  • 用iPad编写C/C++代码(计算机考研党也能用iPad写算法题)

    下载iSH软件 1 在AppStore商店中下载名叫iSH Shell的软件 PS xff1a iSH是一个使用用户模式x86模拟器在iOS设备上获得本地运行的Linux Shell环境的项目 2 安装后点开iSH xff0c 初步了解iS
  • FreeRTOS数据结构——列表与列表项

    在FreeRTOS中存在着大量的基础数据结构列表和列表项的操作 xff0c 要想读懂FreeRTOS的源代码 xff0c 就必须弄懂列表和列表项的操作 一 C语言链表简介 链表就好比一个圆形的晾衣架 xff0c 晾衣架上有很多钩子 xff0
  • ROS1常见问题及解决办法——ROS依赖包安装问题

    ROS依赖包安装问题 问题描述解决方案 问题描述 在ROS编译过程中经常会遇到找不到ROS包的情况 xff0c 如下所示 CMake Error at span class token operator span opt span clas
  • Attention Model(mechanism) 的 套路

    最近刷了一些attention相关的paper 照着here的列表 43 自己搜的paper xff0c 网上相关的资料也有很多 xff0c 在此只讲一讲自己对于attention的理解 xff0c 力求做到简洁明了 一 attention
  • 程序=数据结构+算法

    数据 由 数据元素 组成 xff0c 数据元素 由 数据项 组成 数据元素 xff1a 组成数据的基本单位 xff0c 是集合的个体 数据对象 xff1a 性质相同的数据元素的集合 xff0c 是数据的一个子集 数据结构 xff1a 数据元
  • ROS为上位机与STM32为下位机串口通讯(一)

    STM32通过串口向ROS上位机发送信息 主要实现了STM32 通过串口向ROS上位机发送数据 xff0c 发布者将接收到的数据发布出去并打印出来 xff0c 订阅者订阅发布者发布的消息并打印出来 xff0c 最后通过roslaunch启动
  • 程序员面试真的全都答对就有offer?

    程序员面试 xff0c 技术水平重要吗 xff1f 只要面对面试官 xff0c 估计大家都认为技术水平最重要 xff0c 其他都是幌子 xff01 当然 xff0c 技术是基础 xff0c 但技术并不是全部 xff0c 而且一个面试者的技术
  • 解决vncserver打开远程桌面后没有图标,只有一个鼠标问题

    前言 介绍一个VNC客户端 IIS7服务器管理工具 作为VNC客户端 xff0c 它最优秀的功能就是支持一键导出或导入 xff0c 一键批量打开VNC xff0c 一键批量关闭VNC xff0c 多台VNC 自定义备注 xff0c 自定义分
  • openmv的串口传输

    import sensor image time from pid import PID from pyb import Servo from pyb import UART uartCP 61 UART 1 115200 用于电脑与OPe
  • 三层交换机的“三层”是什么意思?

    关注我们的朋友应该知道 xff0c 之前我们简单分析过二层工业交换机和三层工业交换机的区别 但是近期有客户向我们咨询 xff0c 工业交换机中的三层是指什么意思 xff1f 是指工业交换机中有三层 东西 吗 xff1f 就这个问题我们一起来
  • 外贸人SOHO怎么收汇?2020最新外贸B2B收款结汇方法详解!

    很多做外贸朋友都知道 xff0c 外贸收款 结汇是外贸交易中非常重要的一个环节 一个好的外贸收款渠道 xff0c 可以快速地帮助企业资金回笼 xff0c 支付货款 退税等等 xff0c 能省去很多不必要的麻烦 所以 xff0c 对于外贸从业
  • 在回收站删除的文件怎么恢复

    问题描述 xff1a 回收站清空是很常见的数据恢复故障 在回收站删除的文件怎么恢复接下来我们还需要了解下具体如何恢复回收站清空的资料 xff0c 具体请看正文了解 工具 软件 xff1a 极限数据恢复软件 步骤1 xff1a 先百度搜索并下
  • Jenkins修改显示语言为中文

    最近在Centos7 4里安装了jenkins 2 235 1版本 xff0c 使用的推荐安装插件 xff0c 安装后发现部分中文简体不翻译的情况 一 解决方法 xff1a 默认初始安装的时候已经安排了插件Localization Chin
  • 第三章 九析带你轻松完爆 MinIO - MinIO 客户端使用(mc)

    目录 1 前言 2 邀约 3 介绍 4 mc 安装 5 操作 5 1 查看 minio server 5 2 添加 minio server 5 3 删除 minio server 5 4 查看 minio server 中 bucket
  • 分享一款巨微MS1586低功耗蓝牙芯片

    MS1586包含8位单片机和低功耗 低成本的BLE收发器 xff0c 内部集成了发射机 接收机 GFSK调制解调器和BLE基带处理 遵循BLE广播通道通信 xff0c 具有成本低 体积小 控制方便等优点 特点 4KWOTPROM 256by
  • 推荐系统经典论文文献及业界应用

    Survey方面的文章及资料 Adomavicius G Tuzhilin A Toward the next generation of recommender systems A survey of the state of the a
  • 群辉web station开启http访问文件功能

  • centos7.6 快速架设kiftd私有网盘 文件管理系统

    一 基础环境 安装源ISO CentOS 7 x86 64 DVD 1810 最小化安装系统后先更新 root 64 Server yum update y root 64 Server cat etc redhat release Cen
  • 微信公众号开发

    文章目录 第一章 环境准备1 1 开发工具1 2 创建工程1 3 添加依赖1 4 添加模板1 5 测试接口1 6 内网穿透1 7 接入指南 第二章 基础支持2 1 获取 AccessToken 令牌2 2 获取微信API接口IP地址2 3

随机推荐

  • 果然新鲜电商系统

    项目简介 果然新鲜电商系统是一个类似小米商城的B2C电商平台 xff0c 可做毕业设计参考 访问地址 xff1a https gitee com caochenlei fresh parent 项目截图 网站首页 本地访问 xff1a ht
  • 通用代码生成工具

    项目简介 CodeBuilder可以帮助你快速生成模板文件 xff0c 目前支持mysql oracle sql server数据库 您可以自己制作代码模板并添加到模板目录 xff0c 帮助您可以应付各种开发场景 访问地址 xff1a ht
  • 后台权限管理系统

    项目简介 CommonAdmin是一个按钮级权限管理系统 xff0c 包含企业后台最常用的系统模块 xff0c 代码简洁 xff0c 开箱即用 访问地址 xff1a https gitee com caochenlei common adm
  • 个人博客管理系统

    项目简介 Blog是一款个人博客管理系统 xff0c 是我和同学上学期的期末大作业 xff0c 完成的比较仓促 xff0c 大部分功能已经完成 访问地址 xff1a https gitee com caochenlei blog 主要页面
  • Docker的学习与使用

    目录 第一章 Docker介绍第二章 Docker架构第三章 Docker安装第四章 Docker进程相关命令第五章 Docker镜像相关命令第六章 Docker容器相关命令第七章 Docker容器的数据卷第八章 Docker常见应用部署8
  • Java工程师的进阶之路

    目录 知识点01 xff1a 九大排序算法知识点02 xff1a 二分查找算法知识点03 xff1a 二叉树的遍历知识点04 xff1a Spring IOC知识点05 xff1a Spring AOP知识点06 xff1a Spring
  • 在线代码执行系统

    目录 第一章 安装ubuntu第二章 安装SSH第三章 安装docker第四章 安装docker compose第五章 安装judge0 第一章 安装ubuntu 虚拟机 xff1a VirtualBox 6 1 30 148432 Win
  • TF-IDF

    1 TF IDF是什么 xff1f TF IDF xff1a term frequency inverse document frequency 1 tf idf 作为一种权重经常被用作信息检索和文本挖掘领域 2 这样一种权重时通过统计计算
  • 时间区间拆分算法

    目录 需求描述 xff1a 项目依赖 xff1a 代码实现 xff1a 运行效果 xff1a 需求描述 xff1a 时间范围 xff1a 2022 04 10 09 00 00 2022 04 12 18 00 00 具体描述 xff1a
  • 时间区间合并算法

    目录 需求描述 xff1a 项目依赖 xff1a 代码实现 xff1a 运行效果 xff1a 需求描述 xff1a 时间范围 xff1a 2022 04 10 09 00 00 2022 04 10 10 00 00 2022 04 10
  • 如何排查线上OOM

    目录 操作步骤 xff1a 其他知识 xff1a 操作步骤 xff1a 换目录进行以下操作 xff08 不要在 操作 xff09 span class token builtin class name cd span 安装WGET下载工具
  • 计算饼状图百分比

    目录 需求描述 xff1a 项目依赖 xff1a 代码实现 xff1a 运行效果 xff1a 需求描述 xff1a 给定一个整数数组 xff0c 例如 xff1a 2 3 4 xff0c 计算各个元素的百分比 xff0c 要求百分比累加为1
  • 我是如何解决码云图床失效问题?

    目录 第一章 购买资源包第二章 配置存储桶第三章 上传图片集第四章 替访问域名第五章 配置Typora 第一章 购买资源包 第一步 xff1a 登录阿里云账号第二步 xff1a 访问资源包管理 第三步 xff1a 购买资源包套餐 第四步 x
  • Discord机器人开发

    目录 第一章 Discord账号注册第二章 Discord创建服务器第三章 Discord创建机器人3 1 创建应用3 2 创建机器人3 3 配置机器人3 4 添加机器人 第四章 Discord机器人开发准备4 1 推荐资料4 2 创建工程
  • 如何设计事件管理器

    目录 需求描述 xff1a 项目依赖 xff1a 代码实现 xff1a 定义通用的事件对象定义事件监听器接口定义事件监听器适配器对象定义事件管理器接口定义默认的事件管理器对象创建三个不同的监听器对象 运行效果 xff1a 需求描述 xff1
  • 如何设计缓存中间层

    目录 需求描述 xff1a 工程结构 xff1a 截图代码 工程配置 xff1a pom xmlapplication yml 缓存配置 xff1a CacheConfigCacheBaseCachePolicy 如何使用 xff1a Us
  • Ubuntu中解决无法识别外接显示屏

    解决Ubuntu中无法识别外接显示屏 1 检查Ubuntu是否识别出外接显示器2 解决没有识别出外接显示器问题3 显示器扩展屏幕设置 新买了一个显示器 xff0c 通过HDMI连接电脑后 xff0c 在Windows上连接上就直接可以使用了
  • 基于Redis实现的布隆过滤器

    一 RedisTemplate 1 首先将guava实现的本地的布隆过滤器的算法代码拿过来 span class token comment 算法过程 xff1a 1 首先需要k个hash函数 xff0c 每个函数可以把key散列成为1个整
  • 论文笔记之 Collaborative Deep Learning for Recommender Systems

    这篇论文是KDD2015的一篇用DL去做RS的论文 想法挺有意思的 看过论文的同学都知道整体的模型可以用下图表示 xff1a 这里只讲讲整体的思路与理解 xff1a 1 xff09 这是一个CF和CBF结合用bayes去做 2 xff09
  • 汉明码(Hamming Code)原理及实现

    汉明码 xff08 Hamming Code xff09 原理及实现 汉明码实现原理 汉明码 xff08 Hamming Code xff09 是广泛用于内存和磁盘纠错的编码 汉明码不仅可以用来检测转移数据时发生的错误 xff0c 还可以用