今天学习计组时,学习到了一个新知识海明码,一般用于网络传输中对数据进行校验,如果出差,可以通过海明码这个算法实现查找一个出错位,通过取反的方式纠错,实现原理是在信息位中加入校验位,组成新的二进制串,形成海明码。
海明码的校验原理 每个校验组分别利用校验位和参与形成该校验位的信息进行奇偶校验检查,构成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() {
std::string ans = "1010";
HanmingCode test(ans);
test.Generatehanmcode();
return 0;
}
|