Implementación de código Hamming en C/C++

Prerrequisito: Código Hamming

Dado un bit de mensaje en forma de array msgBit[] , la tarea es encontrar el Código Hamming del bit de mensaje dado.

Ejemplos:

Entrada:  S = “0101”
Salida:
Palabra clave generada:
r1 r2 m1 r4 m2 m3 m4
0 1 0 0 1 0 1
Explicación:
Inicialmente, r1, r2, r4 se establece en ‘0’.
r1 = XOR bit a bit de todas las posiciones de bits que tienen ‘1’ en su posición de bit 0.
r2 = XOR bit a bit de todos los bits que tienen ‘1’ en su posición de 1er bit.
r3 = XOR bit a bit de todos los bits que tienen ‘1’ en su posición de segundo bit.

Entrada:  S = “0111”
Salida: 
Palabra clave generada: 
r1 r2 m1 r4 m2 m3 m4 
0 0 0 1 1 1 1 

 

Enfoque: la idea es encontrar primero la cantidad de bits redundantes que se pueden encontrar inicializando r con 1 y luego incrementándolo en 1 cada vez que 2 r es menor que (m + r + 1) donde m es la cantidad de bits en el mensaje de entrada. Siga los pasos a continuación para resolver el problema:

  • Inicialice r en 1 e increméntelo en 1 hasta que 2 r sea menor que m+r+1 .
  • Inicialice un vector HammingCode de tamaño r + m que será la longitud del mensaje de salida.
  • Inicialice todas las posiciones de los bits redundantes con -1 pasando de i = 0 a r – 1 y configurando hammingCode [2 i –1] = -1 . Luego coloque los bits del mensaje de entrada en todas las posiciones donde hammingCode[j] no es -1 en orden donde 0 <= j < (r + m) .
  • Inicialice una variable one_count con 0 para almacenar el número de unos y luego recorra desde i = 0 hasta (r + m – 1) .
  • Si el bit actual, es decir, hammingCode[i] no es -1 , busque el bit de mensaje que contiene el bit establecido en log 2 (i+1) th posición al atravesar de j = i+2 a r+m incrementando one_count en 1 si (j & (1<<x)) no es 0 y hammingCode[j – 1] es 1 .
  • Si para el índice i , one_count es par, establezca hammingCode[i] = 0; de lo contrario, establezca hammingCode[i] = 1 .
  • Después de atravesar, imprima el vector hammingCode[] como mensaje de salida.

A continuación se muestra la implementación del enfoque anterior:

C

// C program for the above approach
 
#include <math.h>
#include <stdio.h>
 
// Store input bits
int input[32];
 
// Store hamming code
int code[32];
 
int ham_calc(int, int);
void solve(int input[], int);
 
// Function to calculate bit for
// ith position
int ham_calc(int position, int c_l)
{
    int count = 0, i, j;
    i = position - 1;
 
    // Traverse to store Hamming Code
    while (i < c_l) {
 
        for (j = i; j < i + position; j++) {
 
            // If current boit is 1
            if (code[j] == 1)
                count++;
        }
 
        // Update i
        i = i + 2 * position;
    }
 
    if (count % 2 == 0)
        return 0;
    else
        return 1;
}
 
// Function to calculate hamming code
void solve(int input[], int n)
{
    int i, p_n = 0, c_l, j, k;
    i = 0;
 
    // Find msg bits having set bit
    // at x'th position of number
    while (n > (int)pow(2, i) - (i + 1)) {
        p_n++;
        i++;
    }
 
    c_l = p_n + n;
 
    j = k = 0;
 
    // Traverse the msgBits
    for (i = 0; i < c_l; i++) {
 
        // Update the code
        if (i == ((int)pow(2, k) - 1)) {
            code[i] = 0;
            k++;
        }
 
        // Update the code[i] to the
        // input character at index j
        else {
            code[i] = input[j];
            j++;
        }
    }
 
    // Traverse and update the
    // hamming code
    for (i = 0; i < p_n; i++) {
 
        // Find current position
        int position = (int)pow(2, i);
 
        // Find value at current position
        int value = ham_calc(position, c_l);
 
        // Update the code
        code[position - 1] = value;
    }
 
    // Print the Hamming Code
    printf("\nThe generated Code Word is: ");
    for (i = 0; i < c_l; i++) {
        printf("%d", code[i]);
    }
}
 
// Driver Code
void main()
{
    // Given input message Bit
    input[0] = 0;
    input[1] = 1;
    input[2] = 1;
    input[3] = 1;
 
    int N = 4;
 
    // Function Call
    solve(input, N);
}

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to generate hamming code
vector<int> generateHammingCode(
    vector<int> msgBits, int m, int r)
{
    // Stores the Hamming Code
    vector<int> hammingCode(r + m);
 
    // Find positions of redundant bits
    for (int i = 0; i < r; ++i) {
 
        // Placing -1 at redundant bits
        // place to identify it later
        hammingCode[pow(2, i) - 1] = -1;
    }
 
    int j = 0;
 
    // Iterate to update the code
    for (int i = 0; i < (r + m); i++) {
 
        // Placing msgBits where -1 is
        // absent i.e., except redundant
        // bits all positions are msgBits
        if (hammingCode[i] != -1) {
            hammingCode[i] = msgBits[j];
            j++;
        }
    }
 
    for (int i = 0; i < (r + m); i++) {
 
        // If current bit is not redundant
        // bit then continue
        if (hammingCode[i] != -1)
            continue;
 
        int x = log2(i + 1);
        int one_count = 0;
 
        // Find msg bits containing
        // set bit at x'th position
        for (int j = i + 2;
             j <= (r + m); ++j) {
 
            if (j & (1 << x)) {
                if (hammingCode[j - 1] == 1) {
                    one_count++;
                }
            }
        }
 
        // Generating hamming code for
        // even parity
        if (one_count % 2 == 0) {
            hammingCode[i] = 0;
        }
        else {
            hammingCode[i] = 1;
        }
    }
 
    // Return the generated code
    return hammingCode;
}
 
// Function to find the hamming code
// of the given message bit msgBit[]
void findHammingCode(vector<int>& msgBit)
{
 
    // Message bit size
    int m = msgBit.size();
 
    // r is the number of redundant bits
    int r = 1;
 
    // Find no. of redundant bits
    while (pow(2, r) < (m + r + 1)) {
        r++;
    }
 
    // Generating Code
    vector<int> ans
        = generateHammingCode(msgBit, m, r);
 
    // Print the code
    cout << "Message bits are: ";
    for (int i = 0; i < msgBit.size(); i++)
        cout << msgBit[i] << " ";
 
    cout << "\nHamming code is: ";
    for (int i = 0; i < ans.size(); i++)
        cout << ans[i] << " ";
}
 
// Driver Code
int main()
{
    // Given message bits
    vector<int> msgBit = { 0, 1, 0, 1 };
 
    // Function Call
    findHammingCode(msgBit);
 
    return 0;
}
Producción: 

The generated Code Word is: 0001111

 

Complejidad de tiempo: O((M + R) 2 ) donde M es el número de bits en el mensaje de entrada y R es el número de bits redundantes 
Espacio auxiliar: O(M + R)

Publicación traducida automáticamente

Artículo escrito por kedar1514 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *