直接貼代碼了
//============================================================================<br />// Name : Hamming.cpp<br />// Author : wzw<br />// Version :<br />// Copyright : Your copyright notice<br />// Description : Hello World in C++, Ansi-style<br />//============================================================================</p><p>#include <stdio.h><br />#include <math.h><br />#include <conio.h><br />int isRightParity(int,int[]);<br />void getColumn(int,int,int,int[]);<br />void getParity(int[],int,int,int[],int[]);//得到資料與校正碼組合碼<br />void getCodedMessage(int[],int[],int,int[]);<br />int isPowerOfTwo(int);<br />int getParityBit(int);<br />void getNextParityCode(int,int,int[]);<br />int main(){<br />int data_bit; //資料位元長<br />printf("Input The Bits Of Data:/n");<br />scanf("%d",&data_bit);<br />int data[data_bit];<br />for (int i=0;i<data_bit;i++){ //迴圈輸入資料<br />printf("Input The %dth Bit/n",i+1);<br />int temp;<br />temp=(int)getche()-48;<br />if((temp==0)||(temp==1)){ //確保輸入資料時0或1<br />data[i]=temp;<br />printf("/n");<br />}<br />else{<br />printf("/nInput Must Be 0 Or 1/n");<br />i--;<br />}<br />}<br />printf("The Data To Be Coded Is: ");//顯示輸入的待傳輸資料<br />for(int i=0;i<data_bit;i++){<br />printf("%d",data[i]);<br />}<br />int parity_bit; //校正碼位長matrix column;matrix row is parity+data_bit;<br />parity_bit=getParityBit(data_bit); //根據資料位元長選擇最短的檢驗碼,返回位長<br />printf("/nChoose Bits Of Parity Is: %d /n",parity_bit);<br />int parity_code[parity_bit]; //校正碼<br />int coded_message[parity_bit+data_bit]; //資料和校正碼融合之後的資料<br />getParity(data,data_bit,parity_bit,parity_code,coded_message);<br />printf("Parity Is: ");<br />for(int i=0;i<parity_bit;i++){<br />printf("%d",parity_code[i]);<br />}<br />printf("/nCoded Message Is: ");<br />for(int i=0;i<parity_bit+data_bit;i++){<br />printf("%d",coded_message[i]);<br />}<br />printf("/n/nPress Any Key Exit...");<br />getch();<br />}<br />void getColumn(int index,int data_bit,int parity_bit,int column[]){<br />for(int i=0;i<(data_bit+parity_bit);i++){<br />int parity_row[parity_bit];<br />getNextParityCode(parity_bit,i,parity_row);<br />column[i]=parity_row[index];<br />}<br />}<br />void getParity(int data[],int data_bit,int parity_bit,int parity_code[],int coded_message[]){ //計算校正碼P<br />int flag[parity_bit];<br />int column[data_bit+parity_bit];//矩陣一列<br />for(int m=0;m<(int)pow(2,parity_bit);m++){<br />getNextParityCode(parity_bit,m,parity_code);<br />getCodedMessage(data,parity_code,(parity_bit+data_bit),coded_message);<br />for(int i=0;i<parity_bit;i++){<br />flag[i]=0;<br />}<br />for(int i=0;i<parity_bit;i++){<br />getColumn(i,data_bit,parity_bit,column);<br />int matrix_product=0;//乘積<br />for(int j=0;j<(data_bit+parity_bit);j++){<br />matrix_product=matrix_product+coded_message[j]*column[j];<br />}<br />if(matrix_product%2==0){<br />flag[i]=1;<br />continue;<br />}<br />else{<br />flag[i]=0;<br />break;<br />}<br />}<br />if(isRightParity(parity_bit,flag)==1){<br />break;<br />}<br />else{<br />continue;<br />}<br />}<br />}<br />int isRightParity(int length,int flag[]){<br />int temp=1;<br />for(int i=0;i<length;i++){<br />temp=temp*flag[i];<br />}<br />if(temp==1){<br />return 1;<br />}<br />else{<br />return 0;<br />}<br />}<br />void getCodedMessage(int data[],int parity_code[],int length,int coded_message[]){<br />int index_data,index_parity;<br />index_data=index_parity=0;<br />for(int i=0;i<length;i++){<br />if(isPowerOfTwo(i+1)==1){<br />coded_message[i]=parity_code[index_parity];<br />index_parity++;<br />}<br />else{<br />coded_message[i]=data[index_data];<br />index_data++;<br />}<br />}<br />}<br />int isPowerOfTwo(int num){//num is power冪 of 2 or not<br />int ispoweroftwo;<br />int i=0;<br />while(1){<br />int pow2i=(int)pow(2,(double)i);<br />if(num<pow2i){<br />ispoweroftwo=0;<br />break;<br />}<br />else if(num==pow2i){<br />ispoweroftwo=1;<br />break;<br />}<br />else if(num>pow2i){<br />i++;<br />}<br />}<br />return ispoweroftwo;<br />}<br />void getNextParityCode(int parity_bit,int index,int parity_code[]){//change index+1 to BCD<br />int temp=index+1;<br />for(int i=0;i<parity_bit;i++){<br />parity_code[parity_bit-i-1]=temp%2;<br />temp=temp/2;<br />}<br />}<br />int getParityBit(int data_bit){//get least bit of parity<br />int paritybit=0;<br />int power;<br />while(1){<br />paritybit++;<br />power=(int)pow(2,(double)paritybit)-1;<br />if((paritybit+data_bit)<=power){<br />break;<br />}<br />}<br />return paritybit;<br />}<br />
轉載自: http://50vip.com