📜  Java中的汉明码实现

📅  最后修改于: 2022-05-13 01:57:01.316000             🧑  作者: Mango

Java中的汉明码实现

先决条件:汉明码

汉明码是一组纠错码,可用于检测和纠正数据从发送方移动或存储到接收方时可能发生的错误。它是由RW Hamming开发的用于纠错的技术。

例子:

Input: 
message bit = 0101
r1 r2 m1 r4 m2 m3 m4
      0     1  0  1
Output:
Generated codeword :
r1 r2 m1 r4 m2 m3 m4
0  1  0  0  1  0  1

Explanation:
Initially r1, r2, r4 is set to '0'.
r1 = xor of all bits position 
    which has '1' in its 0th-bit position
r2 = xor of all bits
    which has '1' in its 1st-bit position
r3 = xor of all bits
    which has '1' in its 2nd-bit position

下面是汉明码的实现:

// Java code to implement Hamming Code
class HammingCode {
  
    // print elements of array
    static void print(int ar[])
    {
        for (int i = 1; i < ar.length; i++) {
            System.out.print(ar[i]);
        }
        System.out.println();
    }
  
    // calculating value of redundant bits
    static int[] calculation(int[] ar, int r)
    {
        for (int i = 0; i < r; i++) {
            int x = (int)Math.pow(2, i);
            for (int j = 1; j < ar.length; j++) {
                if (((j >> i) & 1) == 1) {
                    if (x != j)
                        ar[x] = ar[x] ^ ar[j];
                }
            }
            System.out.println("r" + x + " = "
                               + ar[x]);
        }
  
        return ar;
    }
  
    static int[] generateCode(String str, int M, int r)
    {
        int[] ar = new int[r + M + 1];
        int j = 0;
        for (int i = 1; i < ar.length; i++) {
            if ((Math.ceil(Math.log(i) / Math.log(2))
                 - Math.floor(Math.log(i) / Math.log(2)))
                == 0) {
  
                // if i == 2^n for n in (0, 1, 2, .....)
                // then ar[i]=0
                // codeword[i] = 0 ----
                // redundant bits are initialized
                // with value 0
                ar[i] = 0;
            }
            else {
  
                // codeword[i] = dataword[j]
                ar[i] = (int)(str.charAt(j) - '0');
                j++;
            }
        }
        return ar;
    }
  
    // Driver code
    public static void main(String[] args)
    {
  
        // input message
        String str = "0101";
        int M = str.length();
        int r = 1;
  
        while (Math.pow(2, r) < (M + r + 1)) {
            // r is number of redundant bits
            r++;
        }
        int[] ar = generateCode(str, M, r);
  
        System.out.println("Generated hamming code ");
        ar = calculation(ar, r);
        print(ar);
    }
}
输出:
Generated hamming code 
r1 = 0
r2 = 1
r4 = 0
0100101