Bitwise OperaTores en C: AND, OR, XOR, Shift & Complementar
ยฟQuรฉ son los Bitwise? Operatores?
Bitwise Operatoros Se utilizan para manipular datos a nivel de bits, tambiรฉn llamados programaciรณn a nivel de bits. Bitwise opera 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 acelerar 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. Recuerde siempre que los operadores bit a bit se utilizan principalmente con el 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 o desplazar los patrones de bits hacia el lado izquierdo o derecho. 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 utilizar para extraer los datos de la expresiรณn entera. Escribamos un programa para demostrar el uso de los 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 todas las operaciones comentadas 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
Resumen
- Los operadores bit a bit son un conjunto de operadores especiales proporcionados por 'C'.
- Se utilizan en programaciรณn a nivel de bits.
- Estos operadores se utilizan para manipular bits de una expresiรณn entera.
- Los operadores lรณgicos, de desplazamiento y de complemento son tres tipos de operadores bit a bit.
- El operador de complemento bit a bit se utiliza para invertir los bits de una expresiรณn.
