XOR en C: guía completa de lo básico a lo avanzado

1. Introducción

Resumen de las operaciones de bits en C

El lenguaje C ofrece operaciones de bits para manejar la memoria y el procesador de manera eficiente. Entre ellas, la más importante es el XOR (OR exclusivo). Las operaciones de bits se utilizan habitualmente en diversas situaciones, como la encriptación de datos, la verificación de datos y la manipulación numérica. El XOR tiene la característica de devolver «1» cuando dos bits son diferentes y «0» cuando son iguales, y es conocido como una operación simple pero poderosa. En este artículo, se explica paso a paso desde los fundamentos hasta las aplicaciones del XOR en C. Se incluyen ejemplos de código reales y está estructurado para que incluso los principiantes lo comprendan fácilmente.

2. Fundamentos del operador XOR

¿Qué es XOR?

XOR (disyunción exclusiva) compara dos valores bit a bit y devuelve “1” cuando los bits son diferentes y “0” cuando son iguales. Por ejemplo, al comparar los bits de los números 5 y 9 como se muestra a continuación, se obtiene el resultado de la operación XOR.
  • Binario de 5: 0101
  • Binario de 9: 1001
Al comparar estos bits con la operación XOR, se obtiene lo siguiente.
Posición de bit5 (0101)9 (1001)Resultado XOR
1011
2101
3000
4110
El resultado es 1100, que en decimal corresponde a “12”. Comprender el funcionamiento básico de esta operación XOR permite aplicarla a operaciones de bits más complejas.
年収訴求

3. Comprender XOR con código de ejemplo

Ejemplo básico de uso de XOR

A continuación se muestra un ejemplo sencillo de cómo ejecutar una operación XOR en C. Este código realiza la operación XOR con los valores 5 y 9 y muestra el resultado.
#include <stdio.h>

int main() {
    int a = 5;
    int b = 9;
    int result = a ^ b;

    printf("5 XOR 9 = %dn", result);  // El resultado es 12
    return 0;
}
Este código calcula el XOR bit a bit de los valores a y b, y almacena el resultado en result. Al ejecutarlo, muestra «5 XOR 9 = 12». Es un buen ejemplo para comprender visualmente las operaciones a nivel de bits.

4. Ejemplos de aplicación del XOR

Intercambio de valores de variables usando XOR

Al aprovechar la característica única del XOR, se pueden intercambiar los valores de dos variables sin usar una variable temporal. El siguiente código muestra cómo intercambiar los valores de las dos variables a y b usando XOR.
#include <stdio.h>

int main() {
    int a = 5;
    int b = 7;

    printf("Before swap: a = %d, b = %dn", a, b);

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    printf("After swap: a = %d, b = %dn", a, b);
    return 0;
}
En este código, al usar XOR tres veces, se intercambian de manera eficiente los valores de a y b. De este modo, es posible cambiar los valores sin una variable temporal, lo que ayuda a ahorrar memoria.

5. Ejemplos prácticos y áreas de aplicación

Detección de números duplicados y números que aparecen un número impar de veces en un arreglo

XOR también puede detectar de manera eficiente los elementos duplicados o los que aparecen un número impar de veces en un arreglo. A continuación se muestra un ejemplo para detectar elementos duplicados y código para encontrar los que aparecen un número impar de veces.

Descubrimiento de números duplicados

#include <stdio.h>

int findDuplicate(int nums[], int size) {
    int duplicate = 0;
    for (int i = 0; i < size; i++) {
        duplicate ^= nums[i];
    }
    return duplicate;
}

int main() {
    int nums[] = {1, 2, 3, 2, 4};
    int size = sizeof(nums) / sizeof(nums[0]);

    printf("El número duplicado es: %dn", findDuplicate(nums, size));
    return 0;
}
En este código, se usa XOR para detectar los valores duplicados en el arreglo. Aprovechando la propiedad de XOR, al aplicar XOR dos veces al mismo número se obtiene 0, dejando solo los valores duplicados en el resultado.

Detección de números que aparecen un número impar de veces

#include <stdio.h>

int findOddOccurrence(int nums[], int size) {
    int result = 0;
    for (int i = 0; i < size; i++) {
        result ^= nums[i];
    }
    return result;
}

int main() {
    int nums[] = {5, 3, 9, 3, 5, 9, 7};
    int size = sizeof(nums) / sizeof(nums[0]);

    printf("El número con aparición impar es: %dn", findOddOccurrence(nums, size));
    return 0;
}
En este código, solo los números que aparecen un número impar de veces permanecen en el resultado final de XOR, lo que permite detectarlos fácilmente.

Uso de XOR en la encriptación de datos

XOR también se utiliza para la encriptación de datos. El siguiente código muestra un ejemplo sencillo de cifrado y descifrado usando XOR.
#include <stdio.h>

void encryptDecrypt(char data[], char key) {
    for (int i = 0; data[i] != '�'; i++) {
        data[i] = data[i] ^ key;
    }
}

int main() {
    char data[] = "Hello World";
    char key = 'K';

    printf("Original: %sn", data);
    encryptDecrypt(data, key);
    printf("Cifrado: %sn", data);
    encryptDecrypt(data, key);
    printf("Descifrado: %sn", data);

    return 0;
}
En este código, al aplicar la operación XOR a los datos se realiza el cifrado y descifrado. Al volver a aplicar XOR, los datos vuelven a su forma original, por lo que se utiliza como una técnica de cifrado simple.

6. Resumen

En este artículo, se explicó desde el uso básico de la operación XOR en C hasta ejemplos de aplicación. XOR se utiliza en una amplia variedad de campos, como la encriptación de datos, la detección de errores, la optimización de programas y el diseño de funciones hash. En particular, gracias a su velocidad y eficiencia, desempeña un papel importante en situaciones que requieren procesamiento de datos a gran escala y alto rendimiento. Esperamos que, a través de este artículo, comprenda cuán poderosa herramienta es la operación XOR y que pueda aprovecharla en su programación futura.