0
#include <iostream>
#include <string>

using namespace std;

int get_bin_representation(char x){

  if(x == '1'){
    return 1;
  }
  else if(x == '0'){
    return 0;
  }
}
int gen_hamming_code(string token){

  int bits[4];
  int temp(0);

  for(int k=0; k<4; k++){
    bits[k] = get_bin_representation(token.at(k));
  }

  int ham_code[7];

  ham_code[0] = bits[0] + bits[1] + bits[3];
  ham_code[1] = bits[0] + bits[2] + bits[3];
  ham_code[2] = bits[0];
  ham_code[3] = bits[1] + bits[2] + bits[3];
  ham_code[4] = bits[1];
  ham_code[5] = bits[2];
  ham_code[6] = bits[3];

  for(int h=0; h<7; h++){
    temp = ham_code[h];
    ham_code[h] = temp%2;
    temp = 0;
  }

  for(int e=0; e<7; e++){
    cout << ham_code[e];
  }
  cout << endl;

  return 0;
}
int main(){

  string usr_input;
  string msg;
  int index(0);

  cout << "Hamming Code Program" << endl;

  while(true){

    cout << endl << ": ";
    getline(cin, usr_input);

    if(usr_input.find("gen") != std::string::npos){
        for(int i=0; i<usr_input.length(); i++){
            if(usr_input.at(i) == ' '){
                index = i;
            }
        }

        for(int j=index; j<usr_input.length(); j++){
            msg+=usr_input.at(j);
        }

        cout << "Hamming code (7,4): ";
        gen_hamming_code(msg);
    }
  }
}

ウィキペディアで提供されている線形代数の定義 (「ハミング コード (7,4)」) を使用しました。プログラムのいくつかの時点で、変数の内容を出力しましたが、1 つの問題を修正すると別の問題が発生しました。出力が正しいかどうかを確認するために、Wikipedia で入手できる例と、オンライン計算機で生成された結果を比較しました。

更新: 質問は解決しました。ここで提供されているアルゴリズムの適応を使用しました(AMP なし)。

4

1 に答える 1

2

まあ、これは間違っています:

ham_code[0] = bits[0] + bits[1] + bits[3];

ハミング コードは、GF(2) 演算を使用して定義されます。GF(2) の加算は、C++ xor 演算子 ( ^) です。%2正しい演算子を使用すると、後のループをなくすことができます。

また、パリティ ビットを平文と混ぜ合わせましたが、これは私が知ったときには決して行われませんでした。また、オンライン シミュレータはインターリーブなしの単純な順序 (平文、パリティ) を使用しています。

于 2013-02-11T20:37:56.037 に答える