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; }
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)