<!-- lang: java --> /** * made by wangming * * 2013-10-28 pm */ package wang.ming.data; public class Analysis { //生成海明碼 public static int[] HaiMingMa(int original[],int len ){ int checkBits=length(len); //計算須要多長的校驗碼 int size=len+checkBits; //發送的數據長度 int send[]=new int[size]; int o_s=0; //original當前的偏移量 //初始化 for(int i=0;i<size;i++){ if(canFit(i+1, checkBits)){ send[i]=original[o_s]; o_s++; }else { send[i]=0; } } for(int i=0;i<checkBits;i++){ int fill=0; for(int j=1;j<=size;j++){ if(canFit(j, checkBits)){ if(in(j, i, checkBits)){ fill=XOR(fill, send[j-1]); } } } int id=(int)Math.pow(2, (double)i); send[id-1]=fill; } return send; } /* * 接受海明碼 並進行處理 */ public static int[]receive(int send[]){ int size=send.length; int bits=codeLength(size); int errorBit=check(send, bits,size); int []receive = new int[size-bits]; if(errorBit>0){ System.out.println("第"+errorBit+"出錯了"); } if(!canFit(errorBit, bits)){ System.out.println("出錯的是校驗碼,不影響結果"); } int index=0; for(int i=0;i<size;i++){ if(canFit(i+1, bits)){ if((i+1)!=errorBit){ receive[index]=send[i]; }else{ receive[index]=XOR(send[i], 1); //對出錯的地方進行處理 與1異或便可獲得原來的值 } index++; } } return receive; } /* * 判斷接受的海明碼是否出錯 */ public static int check(int receive[],int bits,int size){ int errorBit=0; for(int j=0;j<bits;j++){ int flag=0; for(int i=0;i<size;i++){ if(canFit(i+1, bits)){ if(in(i+1, j, bits)){ flag=XOR(flag, receive[i]); } } } int index=(int)Math.pow(2, (double)j)-1; flag=XOR(flag, receive[index]); if(flag==1){ errorBit+=(int)Math.pow(2, (double)j); } } return errorBit; } /* * x=a*(2*2...*2)+b*(2*2...*2)+...+c*2+d * [-bits-1-] [-bits-2-] * 其中常數a,b,c..等於0,1 * 若是 2的y次方前的常數爲1 return true * 爲0 return false */ public static boolean in(int x,int y,int bits){ int dive[]=new int[bits]; int index=0; for(int i=bits-1;i>=0;i--){ if(x/(int)Math.pow(2, (double)i)>0){ dive[index]=1; }else{ dive[index]=0; } x=x%(int)Math.pow(2, (double)i); index++; } if(dive[bits-y-1]==1){ return true; } return false; } /* * 對兩個數作異或操做 * 相等 return 0 * 不然 return 1 */ public static int XOR(int x,int y){ if((x-y)==0){ return 0; }else{ return 1; } } /* * 返回 true or false * 若是index是2的n次方 false * 不然 true */ public static boolean canFit(int index,int checkBits){ for(int i=0;i<checkBits;i++){ if(index==Math.pow(2, (double)i)){ return false; } } return true; } /* * 由海明碼反向推出校驗碼位數 */ public static int codeLength(int len){ int num=0; while((++num)>0){ //逆向判斷 if((double)(len)<=Math.pow(2, (double)num)){ return num; } if(num>20){ return -1; } } return -1; } /* 給定須要傳輸的原始數據 * 返回須要的校驗碼的位數 * len+x+1<=(2*2*2....*2) * [-----x-----] */ public static int length(int len){ int num=0; while((++num)>0){ //校驗碼位數的判斷條件 if((double)(num+len+1)<=Math.pow(2, (double)num)){ return num; } if(num>20){ return -1; } } return -1; } public static void main(String[] args) { System.out.println( Analysis.in(1, 0, 4)); int code[]={1,0,1,1,0}; int receive[]= Analysis.HaiMingMa(code, 5); receive[6]=0; System.out.println(Analysis.check(receive, 4,9)); int recovery[]=Analysis.receive(receive); for(int i=0;i<recovery.length;i++ ){ System.out.print(recovery[i]); } } }