Operadores de manejo de bits

 En C++, los operadores de manejo de bits se utilizan para realizar operaciones a nivel de bits con valores enteros. Estos operadores permiten manipular los bits individuales de un número entero, lo que puede ser útil para tareas como la codificación y decodificación de datos, el establecimiento de banderas de bits y el enmascaramiento de bits.

Tipos de operadores de manejo de bits:

  1. Operadores bit a bit:

    • Y bit a bit (&): Realiza la operación AND bit a bit entre dos operandos. El resultado es un valor entero con el mismo número de bits que los operandos originales. Cada bit del resultado se establece en 1 solo si el bit correspondiente en ambos operandos está establecido en 1.
    • O bit a bit (|): Realiza la operación OR bit a bit entre dos operandos. El resultado es un valor entero con el mismo número de bits que los operandos originales. Cada bit del resultado se establece en 1 si al menos uno de los bits correspondientes en los operandos está establecido en 1.
    • XOR bit a bit (^): Realiza la operación XOR bit a bit entre dos operandos. El resultado es un valor entero con el mismo número de bits que los operandos originales. Cada bit del resultado se establece en 1 si los bits correspondientes en los operandos son diferentes.
    • NO bit a bit (~): Realiza la operación NOT bit a bit sobre un operando. El resultado es un valor entero con el mismo número de bits que el operando original. Cada bit del resultado se invierte (es decir, si es 1 se convierte en 0 y viceversa).
  2. Operadores de desplazamiento de bits:

    • Desplazamiento a la izquierda (<<): Desplaza los bits del operando de la izquierda hacia la izquierda el número de bits especificado por el segundo operando. Los bits desplazados fuera del extremo izquierdo se pierden, y los bits desplazados se rellenan con ceros a la derecha.
    • Desplazamiento a la derecha (>>): Desplaza los bits del operando de la izquierda hacia la derecha el número de bits especificado por el segundo operando. Los bits desplazados fuera del extremo derecho se pierden, y los bits desplazados se rellenan con ceros a la izquierda para números enteros sin signo o con el bit de signo extendido a la derecha para números enteros con signo.
  3. Operadores de asignación de bits:

    • Asignación AND bit a bit (&=): Realiza la operación AND bit a bit entre el operando de la izquierda y el operando de la derecha, y luego almacena el resultado en el operando de la izquierda.
    • Asignación OR bit a bit (|=): Realiza la operación OR bit a bit entre el operando de la izquierda y el operando de la derecha, y luego almacena el resultado en el operando de la izquierda.
    • Asignación XOR bit a bit (^=): Realiza la operación XOR bit a bit entre el operando de la izquierda y el operando de la derecha, y luego almacena el resultado en el operando de la izquierda.
    • Asignación de desplazamiento a la izquierda (<<=): Desplaza los bits del operando de la izquierda hacia la izquierda el número de bits especificado por el operando de la derecha, y luego almacena el resultado en el operando de la izquierda.
    • Asignación de desplazamiento a la derecha (>>=): Desplaza los bits del operando de la izquierda hacia la derecha el número de bits especificado por el operando de la derecha, y luego almacena el resultado en el operando de la izquierda.

Ejemplo de uso:

C++
// Ejemplo de AND bit a bit
int a = 10; // 0b1010
int b = 6;  // 0b0110
int resultado = a & b; // 0b0010

// Ejemplo de OR bit a bit
int a = 10; // 0b1010
int b = 6;  // 0b0110
int resultado = a | b; // 0b1110

// Ejemplo de XOR bit a bit
int a = 10; // 0b1010
int b = 6;  // 0b0110
int resultado = a ^ b; // 0b1000

// Ejemplo de desplazamiento a la izquierda
// Este operador equivale a multiplicar el valor por 2 elevado al numero de 
// desplazamientos, en el ejemplo 10 * (2 ^ 2) = 40
int a = 10; // 0b1010
int resultado = a << 2; // 0b101000 = 40
int numero = 42; // Representación binaria: 0b00101010

// Desplazando 2 bits a la derecha
int resultado = numero >> 2; 

// Representación binaria de 'resultado': 0b00001010

// Explicación:

- Los bits de 'numero' se desplazan 2 posiciones a la derecha.
- Los dos bits más a la derecha se pierden (0b10).
- Los dos bits desplazados se rellenan con ceros (00).

- El resultado final es 0b00001010, que representa el número decimal 10.

Uso del operador de desplazamiento a la derecha:

  • Dividir por potencias de 2: El desplazamiento a la derecha puede usarse como una forma rápida y eficiente de dividir un número entero por una potencia de 2. Por ejemplo, desplazar un número a la derecha 3 posiciones es equivalente a dividirlo por 8.
  • Extraer bits específicos: El desplazamiento a la derecha puede usarse para extraer bits específicos de un número entero. Por ejemplo, desplazar un número a la derecha 4 posiciones y luego realizar una operación AND bit a bit con 15 (0b00001111) aislará los 4 bits menos significativos del número original.
  • Máscaras de bits: El desplazamiento a la derecha puede usarse en conjunto con máscaras de bits para realizar operaciones específicas en conjuntos de bits. Por ejemplo, desplazar un número a la derecha 1 posición y luego realizar una operación XOR bit a bit con 1 (0b00000001) invertirá el bit menos significativo del número original.

Ejemplo adicional:

C++
// Ejemplo de desplazamiento a la derecha con números enteros con signo

int numeroConSigno = -42; // Representación binaria: 11110110 (con complemento a 2)

// Desplazando 2 bits a la derecha
int resultadoConSigno = numeroConSigno >> 2; 

// Representación binaria de 'resultadoConSigno': 11111010

// Explicación:

- Los bits de 'numeroConSigno' se desplazan 2 posiciones a la derecha.
- Los dos bits más a la derecha se pierden (11).
- Los dos bits desplazados se rellenan con el bit de signo extendido (11).

- El resultado final es 11111010, que representa el número decimal -21.



Comentarios

Entradas más populares de este blog

Generación de números aleatorios

Paso de parámetros en funciones

STL de C++