Operadores bit a bits en c

Operadores bit a bits en c
En esto Pista de Linux Artículo, todo sobre las operaciones lógicas bit a bit se explica. Usando un ejemplo práctico con fragmentos de código de imagen, veremos en detalle cada uno de los operadores lógicos utilizados en el idioma C.

Además, explicaremos cómo realizar un enmascaramiento de bits con operaciones lógicas, ya que esto es algo muy útil en la programación y está completamente relacionado con este tipo de operadores.

Descripción de las operaciones bit a bit

Las operaciones bit a bit son lógicas y las operaciones de turno se aplican individualmente a cada bit de una variable. Por ejemplo, si aplicamos la operación y entre las variables "A" y "B", el bit 0 de "A" estará vinculado al bit 0 de "B", el bit 1 de "A" se unirá al bit 1 de "B" ", y así sucesivamente.

Cada bit opera y devuelve su propio resultado y no tiene influencia en el resultado de los bits adyacentes a él.

Este tipo de operación es muy útil para enmascarar bits cuando se usa indicadores de control o indicadores agrupados en un solo elemento de datos, como un entero.

Cómo asignar un valor binario a una variable en el idioma C

Antes de comenzar a explicar de qué se tratan las operaciones lógicas bitwise, veamos cómo asignar un valor a una variable en código binario porque, aunque podemos hacer esto en decimal, hexadecimal o alguna otra representación, visualizar 1s y 0s hace que la programación sea programación mucho más práctico y comprensible. Por ejemplo, en los casos en que los bits representan indicadores de control o indicadores agrupados en un int, doble u otra variable.

Para asignar un valor a una variable en formato binario, necesitamos prefijo la representación binaria con "0b". El siguiente fragmento asigna el valor 131 o 0b10000011 al entero "A" en formato binario y luego muestra su representación decimal en la consola de comando.

#incluir
vacío principal()
int a;
a = 0b10000011;
printf ("La representación decimal para 0b10000011 es: %i \ n", a);

La imagen a continuación muestra el resultado de este código.

Representar los valores binarios en las operaciones de bit a bit y enmascarar hace que la programación sea mucho más fluida y comprensible y evita errores o conversiones que cuestan tiempo.

No operador

El operador lógico para el no es el símbolo "~".

La operación lógica de no negación o de negación es la más simple de todas, tener solo una entrada y una salida.

Esta operación devuelve en su salida el valor binario invertido de su entrada.

Considere la siguiente expresión para la operación lógica no con la entrada "A"

c = ~ a

El resultado en "C" es igual a 1 si "A" es igual a 0 y "C" es igual a 0 si "A" es igual a 1. Esta operación se usa comúnmente para obtener el valor complementario de una variable.

A continuación, veamos la tabla de verdad para la operación no.

a ~ = C
0 ~ = 1
1 ~ = 0

Ejemplo:

En este ejemplo, aplicaremos la operación no a la variable A para obtener su complemento en "C"

Para hacer esto, creamos la variable A de tipo CHAR sin firmar, asignamos el valor 131 y obtenemos el resultado en "C". Luego usamos la función printf () para mostrar el resultado en la consola de comando. A continuación, podemos ver el código para este propósito.

#incluir
vacío principal()

Char sin firmar C;
Char sin firmar a;
a = 0b01111100;
c = ~ a;
printf ("\ nthe decimal representación para 0b10000011 es: %i \ n", c);

En la siguiente figura, vemos el resultado del complemento de "A" . En este caso, el complemento o inverso de 131 es 124 o 01111100 en representación binaria.


Lógico y operador

El operador lógico para la operación y es el símbolo "&"

Veamos la siguiente expresión para la lógica y la operación entre las variables A y B

C = A y B.

El resultado en "C" es igual a 1 solo si "A" y "B" son iguales a 1. En todos los demás casos, "C" es igual a 0.

A continuación, miramos la tabla de verdad para la operación y.

A Y b = C
0 Y 0 = 0
0 Y 1 = 0
1 Y 0 = 0
1 Y 1 = 1

La operación lógica y es muy útil en el enmascaramiento de bits. Más tarde, veremos una sección que explica esta técnica con más detalle.

Ejemplo:

Ahora, veamos un ejemplo en el que realizamos la lógica y la operación entre las variables "A" y "B" de tipo CHAR sin firmar y almacenamos el resultado en "C" para mostrarlo más adelante en la consola de comando.

Asignamos el valor 135 o 10000111 a la variable "A" y 129 o 1000001 a la variable "B" en la representación binaria. Luego, usaremos el operador "&" 'para realizar la operación. A continuación, veremos el código para esto.

#incluir
vacío principal()

Char sin firmar a = 0b10000111;
Char sin firmar B = 0B10000001;
Char sin firmar C;
c = a & b;
printf ("\ n El resultado de A & B es: %i \ n", c);

La imagen muestra el resultado de este código donde la operación y la operación entre "A" y "B" resulta en 129 o 10000001 en binario.

Lógico u operador

El operador lógico para la operación OR es el símbolo ”| ".

Veamos la siguiente expresión para la lógica u operación entre las variables A y B

c = a | b.

El resultado en "C" igualará 1 solo si "A" o "B" o "A" y "B" igualan 1, mientras que igualará 0 solo si "A" y "B" es igual a 0.

A continuación, veamos la tabla de verdad para la operación OR OR.

a | b = C
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Ejemplo

En este ejemplo, veremos cómo realizar la operación lógica o entre las variables "A" y "B" de tipo CHAR sin firmar y almacenar el resultado en "C" para mostrarla más adelante en la consola de comando.

Asignamos el valor 128 o 10000000 a la variable "A" y 3 o 00000011 a la variable "B" en la representación binaria. Luego, usaremos el operador "|" para realizar la operación. A continuación, veremos el código para esta operación.

#incluir
vacío principal()

Char sin firmar a = 0b10000000;
Char sin firmar B = 0b00000011;
Char sin firmar C;
c = a | b;
printf ("\ n El resultado de a | B es: %i \ n", c);

En la imagen a continuación, vemos el resultado de la operación c = a | b que en este caso es 131 o 10000011 en binario.

Operador lógico XOR o exclusivo o

El operador lógico para la operación XOR es el símbolo " ^".

Veamos la siguiente expresión para la operación lógica de XOR entre las variables A y B

c = a ^ b.

El resultado en "C" es igual a 1 solo si uno de los bits "A" o "B" es igual a 1, pero es 0 si "A" y "B" son iguales a 1 o igual a 0.

Esta operación es esencial en los sumadores porque en el sistema binario 1 + 0 = 1 o 0 + 1 también es igual a 1. Pero 1 + 1 = 0 con transporte al siguiente bit más. En este caso, el transporte es realizado por la operación y.

A continuación, miramos la tabla de verdad para la operación XOR.

a ^ b = C
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Ejemplo

Ahora, veamos un ejemplo en el que realizamos la operación lógica de XOR entre las variables "A" y "B" de tipo CHAR Unsigned y almacenamos el resultado en "C" para mostrarlo más tarde en la consola de comando.

Asignamos el valor 135 o 10000111 a la variable "A" y 3 o 00000011 a la variable "B" en notación binaria. Luego, usaremos el operador " ^" para realizar la operación lógica. A continuación, veremos el código para esto.

#incluir
vacío principal()

Char sin firmar a = 0b10000111;
Char sin firmar B = 0b00000011;
Char sin firmar C;
c = a ^ b;
printf ("\ n El resultado de a | B es: %i \ n", c);

Como podemos ver en la imagen, el resultado es 10000100 y los bits cuyas dos entradas son = 1 XOR resulta en 0.

Operadores con asignación

Los operadores con asignación realizan las mismas operaciones lógicas que vimos antes, pero su resultado se almacena en el operando que precede al operador.

La siguiente expresión realiza la lógica y la operación entre la variable "A" y la variable o valor asignado después del operador y el resultado se devuelve en "A".

a & = 55;

Operadores de rotación

Los operadores de rotación son "< > ".

Estos operadores cambian los datos de una variable mediante bits "n" hacia la izquierda o la derecha, respectivamente.

En la siguiente expresión, el operador cambia los datos almacenados en "A" 5 bits a la izquierda.

a = a < < 5

Ejemplo

En este ejemplo, asignaremos el valor 0b000001 a la variable "A" y luego cambiaremos 1 bit a la izquierda en un bucle for y emitir el valor resultante en la consola de comando. Este ciclo se repite 8 veces

#incluir
vacío principal()

Char sin firmar a = 0b00000001;
Char sin firmar C;
para (int bit = 0; bit!= 8; bit ++)
printf ("%i \ n", a);
a = a<<1;

En la siguiente imagen, vemos el resultado con los valores decimales correspondientes a cada posición de los bits en un carácter sin firmar.

Enmascaramiento de bits

En ciertos casos, como cuando definimos múltiples indicadores de control agrupados en un solo registro, solo necesitamos saber o cambiar el valor de uno o más bits, no el registro completo.

Para obtener el estado de uno o más bits específicos, necesitamos definir una máscara que establezca solo los bits de los elementos cuyo valor queremos saber en 1 y aplicar la operación y la operación.

Por ejemplo, si queremos obtener el valor de los bits 0 y 2 de la variable "a", necesitamos definir la siguiente máscara y realizar la operación y la operación.

00000101

En este caso, solo el estado de los bits 0 y 2 se devolverá como resultado, los bits restantes tendrán el valor = 0, independientemente del valor que tengan "a".

Para cambiar el valor, tenemos que aplicar la operación u operación entre la máscara con los bits que queremos establecer en 1 y la variable que queremos cambiar. Si queremos establecerlo en 0, debemos invertir la máscara como se muestra a continuación y aplicar la operación y la operación.

11111010

Ejemplo

En este ejemplo, usamos enmascaramiento de bits para crear un convertidor simple y práctico desde números decimales hasta una cadena con su representación binaria.

Para esta conversación, usaremos 8 máscaras, una para cada bit, pero para que la programación sea más práctica y clara, primero usaremos la máscara 10000000 y luego moveremos un bit a la derecha en cada ciclo del bucle. De esta manera, obtendremos las siguientes 8 máscaras que necesitamos.

10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

El convertidor consiste en un bucle para 8 ciclos, en cada uno de los cuales, consulta el estado del bit correspondiente. Esto se realiza por A y la operación entre los datos a convertir y la máscara correspondiente.

Si el resultado de la operación en "C" es 0, genere este valor con la función printf (). De lo contrario, si el valor del bit es 1, se imprimirá en la consola de comando.

A continuación se muestra el código para este práctico convertidor.

#incluir
vacío principal ()
Char sin firmar a = 143;
Char sin firmar B = 0B10000000;
Char sin firmar C;
printf ("\ n La representación binaria de A es:");
para (int bit = 0; bit!= 8; bit ++)
c = a & b;
if (c == 0)
printf ("0");
demás
printf ("1");
b = b >> 1;
c = 0;

printf ("\ n \ n");

En la siguiente imagen, vemos a continuación el resultado de la conversión para el número 143.

Conclusión

En esto Pista de Linux Artículo, hemos explicado cada uno de los operadores lógicos y de rotación que el lenguaje C proporciona para el procesamiento bit a bits. Para cada uno de estos operadores, hemos creado una sección que muestra el símbolo utilizado para esa descripción del operador y un ejemplo práctico con fragmentos de código e imágenes para cada uno. También hemos incluido una sección que se ocupa del enmascaramiento de bits y lo que es una adición, que está completamente relacionado con las operaciones lógicas de este tipo.