Bitwise OperaTores en C: AND, OR, XOR, Shift & Complementar

โšก Resumen inteligente

En C, los operadores bit a bit manipulan datos a nivel de bit individual, utilizando operaciones AND, OR, XOR, complemento y desplazamiento en operandos enteros para realizar cรกlculos mรกs rรกpidos, empaquetar indicadores y controlar el hardware en la programaciรณn de bajo nivel y en sistemas embebidos.

  • ๐Ÿงฎ Operatores: Seis operadores โ€” AND (&), OR (|), XOR (^), complemento (~), desplazamiento a la izquierda (<<), desplazamiento a la derecha (>>) โ€” actรบan bit a bit.
  • ๐Ÿ”— Y O: El resultado de & es 1 solo cuando ambos bits son 1; | es 1 cuando cualquiera de los bits es 1.
  • ๐Ÿ”€ XOR: El resultado ^ es 1 cuando exactamente un bit es 1, รบtil para alternar bits e intercambiarlos.ping valores.
  • โ†”๏ธ Shifts: Los operadores << y >> desplazan bits hacia la izquierda o hacia la derecha, multiplicando o dividiendo por potencias de dos.
  • ๐Ÿ” Complemento: El operador ~ invierte cada bit, por lo que 0000 1111 se convierte en 1111 0000.
  • ๐Ÿค– Ayuda de IA: Los asistentes de IA y GitHub Copilot generan y explican rรกpidamente la lรณgica de mรกscaras de bits y desplazamiento.

Bitwise Operators en C

ยฟQuรฉ son los Bitwise? Operatores?

Bitwise OperaLas operaciones bit a bit se utilizan para manipular datos a nivel de bits, tambiรฉn conocido como programaciรณn a nivel de bits. Estas operaciones se realizan sobre uno o mรกs patrones de bits o nรบmeros binarios a nivel de sus bits individuales. Se utilizan en cรกlculos numรฉricos para agilizar el proceso de cรกlculo.

A continuaciรณn se muestra la lista de operadores bit a bit proporcionados por el lenguaje de programaciรณn 'C':

Operator Significado
& Operador AND bit a bit
| Operador OR bit a bit
^ Operador OR exclusivo bit a bit
~ Complemento binario a uno Operator es un operador unario
<< Operador de turno a la izquierda
>> Operador de cambio a la derecha

Los operadores bit a bit no se pueden aplicar directamente a tipos de datos primitivos como float, double, etc. Siempre recuerde una cosa: los operadores bit a bit se utilizan principalmente con los tipo de datos entero debido a su compatibilidad.

Los operadores lรณgicos bit a bit trabajan sobre los datos bit a bit, comenzando desde el bit menos significativo, es decir, el bit LSB (que es el bit mรกs a la derecha), avanzando hacia el MSB (bit mรกs significativo), que es el bit mรกs a la izquierda.

El resultado del cรกlculo de los operadores lรณgicos bit a bit se muestra en la tabla que figura a continuaciรณn.

x y x & y x | allรญ x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Bitwise Y

Este es uno de los operadores lรณgicos bit a bit mรกs utilizados. Se representa con un solo signo &. Se escriben dos expresiones enteras en cada lado del operador &.
El resultado de la operaciรณn AND bit a bit es 1 si ambos bits tienen el valor 1; de lo contrario, el resultado siempre es 0.

Consideremos que tenemos 2 variables op1 y op2 con valores de la siguiente manera:

Op1 = 0000 1101
Op2 = 0001 1001

El resultado de la operaciรณn AND sobre las variables op1 y op2 serรก

Result = 0000 1001

Como podemos ver, se comparan dos variables poco a poco. Siempre que el valor de un bit en ambas variables sea 1, el resultado serรก 1 o 0.

Bitwise O

Estรก representado por un รบnico signo de barra vertical (|). Se escriben dos expresiones enteras a cada lado del operador (|).

El resultado de la operaciรณn OR bit a bit es 1 si al menos una de las expresiones tiene el valor 1; de lo contrario, el resultado siempre es 0.

Consideremos que tenemos 2 variables op1 y op2 con valores de la siguiente manera:

Op1 = 0000 1101
Op2 = 0001 1001

El resultado de la operaciรณn OR sobre las variables op1 y op2 serรก

Result = 0001 1101

Como podemos ver, se comparan dos variables poco a poco. Siempre que el valor de un bit en una de las variables sea 1, entonces el resultado serรก 1 o 0.

Operaciรณn OR exclusiva bit a bit

Estรก representado por un sรญmbolo (^). Se escriben dos expresiones enteras a cada lado del operador (^).

El resultado de la operaciรณn OR exclusivo bit a bit es 1 si solo una de las expresiones tiene el valor 1; de lo contrario, el resultado siempre es 0.

Consideremos que tenemos 2 variables op1 y op2 con valores de la siguiente manera:

Op1 = 0000 1101
Op2 = 0001 1001

El resultado de la operaciรณn XOR sobre las variables op1 y op2 serรก

Result = 0001 0100

Como podemos ver, se comparan dos variables poco a poco. Siempre que solo una variable tenga el valor 1, el resultado serรก 0; de lo contrario, el resultado serรก 0.

Escribamos un programa simple que demuestre operadores lรณgicos bit a bit.

#include <stdio.h>
int main() 
{
int a = 20;	/* 20 = 010100 */  
int b = 21;	/* 21 = 010101 */
int c = 0;           

c = a & b;       /* 20 = 010100 */ 
printf("AND - Value of c is %d\n", c );

c = a | b;       /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );

c = a ^ b;       /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );

getch();
}

Salida:

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

Operadores de desplazamiento bit a bit

Los operadores de desplazamiento bit a bit se utilizan para mover/desplazar los patrones de bits hacia la izquierda o hacia la derecha. Izquierda y derecha son dos operadores de desplazamiento proporcionados por 'C' que se representan de la siguiente manera:

Operand << n (Left Shift)
Operand >> n (Right Shift)

Aquรญ,

  • un operando es una expresiรณn entera sobre la cual tenemos que realizar la operaciรณn de desplazamiento.
  • 'n' es el nรบmero total de posiciones de bits que tenemos que cambiar en la expresiรณn entera.

La operaciรณn de desplazamiento a la izquierda desplazarรก el nรบmero 'n' de bits hacia el lado izquierdo. Los bits mรกs a la izquierda de la expresiรณn aparecerรกn y se completarรกn n bits con el valor 0 en el lado derecho.

La operaciรณn de desplazamiento a la derecha desplazarรก la cantidad 'n' de bits hacia el lado derecho. Los 'n' bits mรกs a la derecha de la expresiรณn se eliminarรกn y el valor 0 se completarรก en el lado izquierdo.

Ejemplo: x es una expresiรณn entera con datos 1111. Despuรฉs de realizar la operaciรณn de cambio, el resultado serรก:

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

ShiftLos operadores s se pueden combinar y luego se pueden usar para extract los datos de la expresiรณn entera. Escribamos un programa para demostrar el uso de operadores de desplazamiento bit a bit.

#include <stdio.h>
int main() {
int a = 20;	/* 20 = 010100 */  
int c = 0;           

c = a << 2;	/* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );

c = a >> 2;	/*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}

Salida:

Left shift - Value of c is 80
Right shift - Value of c is 5

Despuรฉs de realizar la operaciรณn de desplazamiento a la izquierda, el valor pasarรก a ser 80, cuyo equivalente binario es 101000.

Despuรฉs de realizar la operaciรณn de desplazamiento a la derecha, el valor pasarรก a ser 5 cuyo equivalente binario es 000101.

Operador de complemento bit a bit

El complemento bit a bit tambiรฉn se denomina operador de complemento a uno, ya que siempre toma un solo valor o un operando. Es un operador unario.

Cuando realizamos complemento en cualquier bit, todos los 1 se convierten en 0 y viceversa.

Si tenemos una expresiรณn entera que contiene 0000 1111, entonces despuรฉs de realizar la operaciรณn de complemento bit a bit, el valor se convertirรก en 1111 0000.

El operador de complemento bit a bit se denota mediante el sรญmbolo tilde (~).

Escribamos un programa que demuestre la implementaciรณn del operador de complemento bit a bit.

#include <stdio.h>
int main() {
int a = 10;	/* 10 = 1010 */  
int c = 0;           
c = ~(a);      
printf("Complement - Value of c is %d\n", c );
return 0;
}

Salida:

Complement - Value of c is -11

Aquรญ hay otro programa, con un ejemplo de todos los operadores que hemos visto hasta ahora:

#include <stdio.h>
main() {
unsigned int x = 48;	/* 48 = 0011 0000 */  
unsigned int y = 13;	/* 13 = 0000 1101 */
int z = 0;           

z =x & y;       /* 0 = 0000 0000 */ 
printf("Bitwise AND Operator - x & y = %d\n", z );

z = x | y;       /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );

z= x^y;       /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);

z = ~x;          /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);

z = x << 2;     /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );

z= x >> 2;     /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}

Despuรฉs de compilar y ejecutar el programa, produce el siguiente resultado:

Bitwise AND Operator - x & y = 0
Bitwise OR Operator - x | y = 61
Bitwise XOR Operator- x^y= 61
Bitwise One's Complement Operator - ~x = -49
Bitwise Left Shift Operator x << 2= 192
Bitwise Right Shift Operator x >> 2= 12

Preguntas Frecuentes

La operaciรณn AND bit a bit (&) opera sobre bits individuales y devuelve un nรบmero entero, mientras que la operaciรณn AND lรณgica (&&) prueba expresiones completas y devuelve un รบnico valor booleano verdadero o falso.

Shift 1 Para crear una mรกscara: establecer con el valor | (1 << n), borrar con el valor & ~ (1 << n) y alternar con el valor ^ (1 << n).

Un desplazamiento a la izquierda de n unidades multiplica un valor sin signo por 2 elevado a la potencia n; un desplazamiento a la derecha lo divide, por lo que los compiladores utilizan desplazamientos para aumentar la velocidad.

Comprueba el nรบmero y 1. El bit menos significativo devuelve 1 para valores impares y 0 para valores pares, mรกs rรกpido que el operador mรณdulo.

El firmware integrado, los controladores, la criptografรญa, la compresiรณn, los grรกficos y las redes los utilizan para empaquetar indicadores, leer registros de hardware, crear mรกscaras de permisos y acelerar las operaciones aritmรฉticas.

Shift Los operadores tienen una vinculaciรณn mรกs fuerte que los relacionales, mientras que &, ^, y | se sitรบan por debajo de la igualdad pero por encima de los operadores lรณgicos && y ||, asรญ que use parรฉntesis para mayor seguridad.

Sรญ. Un asistente de codificaciรณn con IA escribe mรกscaras y desplazamientos a partir de una instrucciรณn, explica complementos negativos y convierte ejemplos binarios en cรณdigo C funcional. Siempre compruebe el resultado.

Copiloto de GitHub Sugiere macros de mรกscara de bits, funciones auxiliares para establecer y borrar bits, y operaciones matemรกticas de desplazamiento a partir de un comentario; revise sus sugerencias comparรกndolas con su diseรฑo de bits.

Resumir este post con: