Reference   Language (extended) | Libraries | Comparison | Changes

XOR (^) y Not (~) a nivel de bits

XOR a nivel de bits (^)

Existe un operador en C++ llamado OR exclusivo a nivel de bits, o XOR a nivel de bits. Este operador se escribe con el símbolo del acento circunflejo (^). Es muy similar al operador OR a nivel de bits (|) con la diferencia de que asigna un 0 a la posición del resultado cuyas entradas tienen ambas en esa posición un 1 (1 + 1 = 0)

    1  1  0  0    operando1
    0  1  0  1    operando2
    ----------
    1  0  0  1    (operando1 ^ operando2) = resultado

Otra forma de ver el XOR a nivel de bits es que cada bit del resultado es un 1 si los bits de los operandos son diferentes o 0 si los bits son iguales.

A continuación se explica un ejemplo simple:

 
    int x = 12;     // binario: 1100
    int y = 10;     // binario: 1010
    int z = x ^ y;  // binario: 0110, o decimal: 6

El operador ^ se usa normalmente para conmutar bits (cambiar de un estado 0 a 1 o viceversa) en una expresión entera, dejando otros bits como estaban. Por ejemplo:


    y = x ^ 1;   // conmuta el bit menos significativo de x y guarda el resultado en y.

NOT a nivel de bits (~)

El operador NOT a nivel de bits en C++ es el carácter virgulilla (~). A diferencia de & y |, el NOT a nivel de bits se aplica al operando de su derecha. Conmuta cada bit a su opuesto: 0 se transforma en 1 y 1 se transforma en 0. Por ejemplo:

    0  1    operando1

   ----------
    1  0    ~ operando1

    int a = 103;    // binario:  0000000001100111
    int b = ~a;     // binario:  1111111110011000 = -104


Quizá sea poco intuitivo el resultado por ser negativo. Esto ocurre porque el bit más significativo en un número entero es el llamado "bit de signo". Si este bit es 1, el número se interpreta como negativo. Esta codificación se llama "complemento a dos".

También es importante recalcar que para cualquier entero x, ~x es lo mismo que -x-1.

A veces, el bit de signo en una expresión entera puede ocasionar sorpresas inesperadas. Página principal Referencia

Correcciones, sugerencias, y nueva documentación deberán ser publicadas en el Foro (castellano) o en el Foro (inglés).

El texto de la referencia de Arduino está publicado bajo la licencia Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0. Los ejemplos de código de la referencia están liberados al dominio público.

Share