Operaciones bit a bit en C

Muhammad Husnain 16 febrero 2024
  1. Operadores bit a bit & y &=
  2. Bit a bit | y operadores |=
  3. Operadores bit a bit ^ y ^=
  4. Operadores de desplazamiento bit a bit (>>) y (<<)
  5. Taquigrafía aritmética (sentencias de asignación compuesta)
  6. Análisis léxico y lo que no puedes hacer
Operaciones bit a bit en C

Este artículo analiza las operaciones bit a bit (y los operadores) en C. Estos conceptos también se extienden a C++.

Además de estos operadores, el artículo analiza una notación abreviada de asignación de operadores comúnmente mal entendida (como la asignación de operadores +=). Discutiremos esto en el contexto de los operadores bit a bit.

El artículo tendrá un ejemplo de cada uno de estos operadores mostrando ambas notaciones y sus respectivas salidas. También discutiremos las notaciones abreviadas que no son compatibles con C.

Por último, discutiremos brevemente el análisis léxico, que es una etapa en la compilación del programa donde el compilador genera tokens. Estas son las partes más pequeñas del código, como palabras clave, identificadores, constantes, cadenas literales, etc.

Operadores bit a bit & y &=

& es el operador bit a bit y. Se usa así:

int test = 0x6A;
test = test & 0x50;

El código anterior ejecuta la comparación bit a bit y entre 0x6A y 0x50 y guarda el resultado en la variable prueba. La operación bit a bit y compara cada bit de ambos argumentos.

El resultado es 1 para cada bit si los bits de ambos operandos son 1, y el resultado es 0 en caso contrario.

El binario para 0x6A es 1101010, y el binario para 0x50 es 1010000. Por tanto, el resultado de la operación y es 1000000.

Ahora podemos discutir la notación abreviada. El fragmento de código anterior se puede escribir convenientemente de la siguiente manera:

int test2 = 0x6A;
test2 &= 0x50;

En general, x &= 5 es equivalente a x = x & 5. Sin embargo, esto también se puede extender a otras operaciones; los más habituales serían +=, -=, *=, /=.

Ejemplos menos comunes de esta notación abreviada son las operaciones bit a bit como >>=, <<=, |=, &=, ^=.

Bit a bit | y operadores |=

| es el operador or inclusivo bit a bit.

int test = 0x6A;
test = test | 0x50;

La notación abreviada para esto será:

int test = 0x6A;
test |= 0x50;

El valor resultante de test es 1111010.

La operación bit a bit inclusiva o compara cada bit de ambos argumentos. El resultado es 1 para cada bit si alguno de los bits de los operandos es 1, y el resultado es 0 sólo cuando ambos operandos son 0.

Operadores bit a bit ^ y ^=

^ es el operador o exclusivo bit a bit.

int test = 0x6A;
test = test ^ 0x50;

La notación abreviada para esto será:

int test = 0x6A;
test ^= 0x50;

El valor resultante de test es: 0111010

La operación bit a bit exclusiva o compara cada bit de ambos argumentos. El valor del bit resultante es 1 para cada bit del resultado si los dos bits tienen valores diferentes; es 0 si ambos bits tienen el mismo valor.

Operadores de desplazamiento bit a bit (>>) y (<<)

Los operadores de desplazamiento tienen dos operandos.

El desplazamiento se aplica en el operando a la izquierda. Y el número de bits a los que se aplica el desplazamiento está determinado por el operando derecho.

Hay dos tipos de desplazamientos: el desplazamiento a la izquierda <<, y el desplazamiento a la derecha >>. Generalmente se usa de la siguiente manera:

Consulte este documento vinculado para obtener más detalles sobre el resultado del operador de turno si no está seguro de sus detalles.

int test5 = 0xFF;
test5 = test5 << 2;

En este ejemplo, los bits almacenados en test5 se desplazarán a la izquierda (como lo indica la dirección del operador) en 2 bits.

Before shift : 0011111111 After shift : 1111111100

Del mismo modo, para el desplazamiento a la derecha:

int test5 = 0xFF;
test5 = test5 >> 2;

En este ejemplo, los bits almacenados en test5 se desplazarán a la derecha 2 bits.

Before shift : 11111111 After shift : 00111111

La notación abreviada para los desplazamientos a la derecha y a la izquierda es similar a la que tenemos arriba.

Notación abreviada de desplazamiento a la derecha:

int test5 = 0xFF;
test5 >>= 2;

Notación abreviada de desplazamiento a la izquierda:

int test5 = 0xFF;
test5 <<= 2;

Taquigrafía aritmética (sentencias de asignación compuesta)

Esta sección discutirá brevemente las abreviaturas de las operaciones aritméticas. Las siguientes dos declaraciones después de la declaración de la variable son equivalentes:

Para la adición:

int addTest = 5;

addTest += 5;

y

addTest = addTest + 5;

Para la multiplicación:

int multTest = 5;

multTest *= 5;

y

multTest = multTest * 5;

Para la división:

int divTest = 5;

divTest /= 5;

y

divTest = divTest / 5;

Para la resta:

int subTest = 5;

subTest -= 5;

y

subTest = subTest - 5;

Para módulo/resto (%):

int remTest = 5;

remTest %= 5;

y

remTest = remTest % 5;

Análisis léxico y lo que no puedes hacer

El análisis léxico es una etapa en la que cada operando y el operador se separan en tokens. Por ejemplo, en una sentencia x + 2, donde x es una variable, el analizador separará x y 2 como operandos y + como operador.

Para la notación abreviada, los operadores como |= se almacenan con un código de token, que es suficiente para identificarlos. Si alguna abreviatura no funciona, (simplemente) no se ha definido para el analizador léxico C; incluso si pasan el analizador léxico, el analizador de sintaxis los rechazará.

Esta es la razón por la cual las abreviaturas como >>>> o ||= o &&= no funcionan. Quizás habría un lenguaje de programación donde se acepten como operadores válidos.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Artículo relacionado - C Bit