⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hanmingmadecode.txt

📁 汉明码的译码c语言实现
💻 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 + -