📄 hanmingmadecode.txt
字号:
#include <iostream>
#include <fstream>
#include <stdio.h>
#define N 1270
#define K 1200
#define G 70
//#define HAIMING
using namespace std;
int len[N];
int i_2_r(int a) //求一个2^n次方的数的幂
{
int count=0;
if(a==1)
return 0;
while(a>1)
{
a=a/2;
count++;
}
return count;
}
void in_to_Group(int a[],int b,int n) //添加到各组中
{
int i;
for(i=1;i<=n;i++)
if(a[i]==-1)
a[i]=b;
}
int _2_r_gt_k_r(int k,int r) //判断 2^r >= k+r+1
{
int i,s = 1;
for(i = 1;i <= r;i++)
s = 2*s;
if(s >= k+r+1)
return 1;
else
return 0;
}
int is_i_2_r(int i) //判断 i 是否为 2^n 位
{
if(i == 1)
return 1;
if(i%2 != 0)
return 0;
while(i%2 == 0 && i != 1)
i=i/2;
if(i==1)
return 1;
return 0;
}
/*int int_to_invdec(int n) //求一个整数的逆序的二进制码
{
int i=1,j,b[N]; //以计算校验位号
while(n)
{
b[i++]=n%2;
n/=2;
}
for(j = 1;j<=(i-1);j++)
a[j]=b[j];
for(j = 1;j<=(i-1);j++)//测试
cout<<a[j];
cout<<endl;
return i-1; //返回位数
}*/
int count1(int a[],int n) //计算 1 的个数,为偶数是返回0
{
int i,count = 0;
for(i = 0;i<n;i++)
if(a[i] == 1)
count++;
if(count%2 == 0)
return 0;
return 1;
}
int *decodehaiming(int decode[],int k,int r)
{
int group[G][K],i,g,j,err=0,encode[N];
int count[G],infor[K];
int a_l,h=1, u=1,a[N],p=1;
for(i=0;i<(k+r);i++)
encode[i]=decode[i];
for(i=0;i<(k+r);i++) //测试输入
cout<<encode[i];
cout<<endl;
//for(i=0;i<N;i++) //测试
// a[i]=-1;
for(i=0;i<=r;i++)
{
len[i]=0;
for(g=0;g<=k;g++)
group[i][g]=-1;
}
for(i=0;i<r;i++) //测试分组数组的初始化
for(g=0;g<k;g++)
cout<<group[r][g];
//cout<<len[i];
cout<<endl;
for(i=1;i<=k+r;i++) //!!!*从添加检测位后的第 1 位开始进行分组 ( 关键 )
{
h=1;
if(is_i_2_r(i))
{
group[i_2_r(i)][0]=encode[i-1];
len[i_2_r(i)]++;
}
else
{
// a_l=int_to_invdec(i);
u=i;
while(u)
{
a[h]=u%2;
h++;
u/=2;
}
a_l=h-1;
for(g=1;g<=r;g++) //共分为 r 组
{
for(j=1;j<=a_l;j++)
if(a[j]==1) //**查转化后 a[] 中为 1 的下标位(如为1则分给第1组,为2则分给第二组等等)
if(g==j) //若分组号与下标位相同,
{
//in_to_Group(group[g-1],encode[i-1],len[g-1]);//**将该信息码添加到第 g 小组中
for(p=0;p<=len[g-1];p++)
{
if(group[g-1][p]==-1)
group[g-1][p]=encode[i-1];
}
len[g-1]++; //*第 g 小组长度增 1
break;
}
}
}
}
// for(i=0;i<len[2];i++)
// cout<<group[2][i]<<"zhi"<<endl;
// cout<<endl;
for(i=0;i<r;i++)
count[i]=count1(group[i],len[i]);
i=1;
for(g=0;g<r;g++)
{
err=err+count[g]*(i);
i=i*2;
}
//cout<<group[i][g];
// cout<<endl;
// for(i=0;i<r;i++)//测试
cout<<"err="<<err<<endl;
if(err==0)
{
g=0;
for(i=0;i<k+r;i++)
{
if(!is_i_2_r(i+1) )
infor[g++]=encode[i];
}
}
else
{
if(encode[err-1]>0)
encode[err-1]= encode[err-1]-1;
else
encode[err-1]= encode[err-1]+1;
g=0;
for(i=0;i<k+r;i++)
{
if(!is_i_2_r(i+1) )
infor[g++]=encode[i];
}
}
cout<<"信息码为:"<<endl;
for(i=0;i<k;i++)
cout<<infor[i];
cout<<endl;
return infor;
}
void main(int argc, char* argv[])
{
int decode[]={0,0,1,0,1,0,0,1,1,1,0,0,1,1,1,1,1},*infor;
decodehaiming(decode,12,5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -