#include <Arduino.h> // Asegúrate de incluir la biblioteca para Arduino
// Función para verificar si un número es potencia de 2
bool esPotenciaDeDos(int n) {
return (n & (n - 1)) == 0;
}
// Función para calcular el código Hamming
void calcularCodigoHamming(const String& bits, int* hammingCode, int& totalBits) {
int numBits = bits.length();
totalBits = numBits;
int paridad = 0;
// Calcular el número de bits de paridad necesarios
while ((1 << paridad) < (totalBits + paridad + 1)) {
paridad++;
}
totalBits += paridad;
// Inicializar el arreglo del código Hamming
for (int i = 0; i < totalBits; i++) {
hammingCode[i] = -1; // -1 para indicar que el bit aún no está asignado
}
// Asignar bits originales a las posiciones que no son potencias de dos
int j = 0; // Índice para recorrer los bits originales
for (int i = 1; i <= totalBits; i++) {
if (!esPotenciaDeDos(i)) {
hammingCode[i - 1] = bits.charAt(j) - '0'; // Convertir char a int
j++;
}
}
// Calcular los bits de paridad
for (int p = 0; p < paridad; p++) {
int pos = (1 << p);
int suma = 0;
// Sumar todos los bits relevantes para este bit de paridad
for (int k = 1; k <= totalBits; k++) {
if (k & pos) { // Si el bit está en la posición relevante
suma += hammingCode[k - 1];
}
}
hammingCode[pos - 1] = suma % 2; // Bit de paridad
}
}
void setup() {
Serial.begin(9600); // Inicializar la comunicación serial
String inputBits;
// Pedir al usuario que ingrese el código binario
Serial.println("Ingrese un código binario de hasta 8 bits:");
while (Serial.available() == 0) {
// Esperar a que el usuario ingrese datos
}
inputBits = Serial.readString(); // Leer la entrada del usuario
// Eliminar espacios y saltos de línea
inputBits.trim();
// Validar que el código tenga entre 1 y 8 bits
if (inputBits.length() < 1 || inputBits.length() > 8) {
Serial.println("Error: El código debe tener entre 1 y 8 bits.");
return;
}
// Validar que el código solo contenga 0s y 1s
for (int i = 0; i < inputBits.length(); i++) {
if (inputBits.charAt(i) != '0' && inputBits.charAt(i) != '1') {
Serial.println("Error: El código solo puede contener 0s y 1s.");
return;
}
}
int hammingCode[12]; // Arreglo para almacenar el código Hamming
int totalBits = 0;
calcularCodigoHamming(inputBits, hammingCode, totalBits);
// Mostrar el código Hamming resultante
Serial.print("El código Hamming convertido es: ");
for (int i = 0; i < totalBits; i++) {
Serial.print(hammingCode[i]);
}
Serial.println(); // Nueva línea después de mostrar el resultado
}
void loop() {
// El código principal del Arduino debe estar aquí, pero este ejemplo no necesita loop
}