IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 计算机组成原理:用c++实现汉明码 -> 正文阅读

[C++知识库]计算机组成原理:用c++实现汉明码

今天学习计组时,学习到了一个新知识海明码,一般用于网络传输中对数据进行校验,如果出差,可以通过海明码这个算法实现查找一个出错位,通过取反的方式纠错,实现原理是在信息位中加入校验位,组成新的二进制串,形成海明码。

海明码的校验原理
每个校验组分别利用校验位和参与形成该校验位的信息进行奇偶校验检查,构成k个校验方程s1,s2,s3。
若其中一个答案为1说明这个校验方程出错,通过出错的方程下标累加可以得到出错的位置。

实现代码:这里并无提供检验,若想实现校验,函数中以提供函数存储数据,对数据进行操作即可。

#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

/*汉明码的生产和检测一位错误*/
class HanmingCode {
 public:
  /*构造函数*/
  HanmingCode(std::string& _inforcode) {
    this->inforlen = _inforcode.size();
    for (auto& now : _inforcode) {
      this->inforcode.push_back(now - '0');
    }
  }

  /*生成校验位长度*/
  void Generateveriflen() {
    for (int i = 0;; i++) {
      if ((1 << i) - 1 >= inforlen + i) {
        this->veriflen = i;
        return;
      }
    }
  }

  /*生成汉明码长度*/
  void Generatehanmlen() {
    Generateveriflen();
    this->hanmlen = this->inforlen + this->veriflen;
    return;
  }

  /*生成校验码*/
  void Generateverifcode() {
    for (int i = 0; i < this->veriflen; i++) {
      this->verifcode.push_back(0);
    }

    int k = 0, m = 0;

    /*收集非校验位*/
    for (int i = 1; i <= this->hanmlen; i++) {
      if (i == (1 << k)) {
        k++;
      } else {
        int tmp = i, ks = this->veriflen - 1;
        while (tmp) {
          if (tmp >= (1 << ks)) {
            tmp -= (1 << ks);
            verifcode[ks] ^= inforcode[m];
          }
          ks--;
        }
        m++;
      }
    }
  }

  /*生成海明码*/
  void Generatehanmcode() {
    this->Generatehanmlen();
    this->Generateverifcode();
    for (int i = 1, j = 0, k = 0, s = 0; i <= hanmlen; i++) {
      if (((1 << s)) == i) {
        hanmcode.push_back(verifcode[j++]);
        s++;
      } else {
        hanmcode.push_back(inforcode[k++]);
      }
    }
    for (auto& x : hanmcode) {
      std::cout << x;
    }
    std::cout << std::endl;
  }

 private:
  int inforlen;               /*信息码长度*/
  int veriflen;               /*校验码长度*/
  int hanmlen;                /*汉明码长度*/
  std::vector<int> hanmcode;  /*汉明码*/
  std::vector<int> inforcode; /*信息码*/
  std::vector<int> verifcode; /*校验码*/
};

int main() {
  /*[1][2][3][4]....按照从做往右大小递增顺序编写,最后生成的汉明码是从左往右顺序的答案*/
  std::string ans = "1010";
  HanmingCode test(ans);
  test.Generatehanmcode();
  return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:50:34  更:2022-03-03 15:57:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:21:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码