1. Resumen de las operaciones de bits

En las computadoras modernas, todos los datos se almacenan en forma binaria, es decir, en dos estados: 0 y 1. Las operaciones que la computadora realiza sobre datos binarios (como suma, resta, multiplicación y división) se denominan operaciones de bits, es decir, operaciones que se realizan sobre cada bit de un número binario.

Para comprender mejor las operaciones de bits, pongamos un ejemplo sencillo: supongamos que tenemos el siguiente código para realizar la suma de dos números enteros:

int a = 35;
int b = 47;
int c = a + b;

La computadora convertirá estos dos enteros a forma binaria y luego realizará la suma:

35:  0010 0011
47:  0010 1111
----------------
82:  0101 0010

Por lo tanto, en comparación con el uso directo de+、-、*、/operadores, el uso adecuado de las operaciones de bits puede mejorar significativamente la eficiencia de ejecución del código en la máquina.

2. Vista general de las operaciones de bits

Símbolo Descripción Regla de operación
& y El resultado es 1 solo cuando ambos bits son 1
| o El resultado es 0 solo cuando ambos bits son 0
^ XOR (O exclusiva) Si los dos bits son iguales, el resultado es 0; si son distintos, es 1
~ Complemento (NOT) 0 se convierte en 1, 1 se convierte en 0
<< Desplazamiento a la izquierda Todos los bits binarios se desplazan a la izquierda cierta cantidad de posiciones; los bits altos se descartan y los bits bajos se rellenan con 0
>> Desplazamiento a la derecha Todos los bits binarios se desplazan a la derecha cierta cantidad de posiciones; los bits altos se rellenan con 0 o con el bit de signo

3. Operador AND bit a bit (&)

Definición: realiza la operación "AND" sobre los bits binarios de los dos datos que participan en la operación.

Regla de operación:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Resumen: el resultado es 1 solo cuando ambos bits son 1; de lo contrario, el resultado es 0.

Por ejemplo:3 & 5es decir0000 0011 & 0000 0101 = 0000 0001, por lo tanto3 & 5su valor es 1.

Nota: los números negativos participan en la operación AND bit a bit en forma de complemento a dos.

Usos:

  1. Poner a cero: si se desea poner a cero una unidad, basta con realizar la operación AND con un valor cuyos bits sean todos cero; el resultado será cero.
  2. Obtener los bits específicos de un número: por ejemplo, para obtener losX = 1010 1110bits bajos (4 bits) de un número, basta con buscar otro númeroY = 0000 1111, y luegoX & Y = 0000 1110se puede obtenerXlos bits específicos de ese número.
  3. Determinar par/impar: al determinar si el último bit es 0 o 1 se decide si es par o impar; se puede usarif ((a & 1) == 0)en lugar deif (a % 2 == 0)para determinar siaes un número par.

4. Operador OR bit a bit (|)

Definición: realiza la operación "OR" sobre los bits binarios de los dos objetos que participan en la operación.

Regla de operación:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Resumen: si al menos uno es 1, el valor es 1.

Por ejemplo:3 | 5es decir0000 0011 | 0000 0101 = 0000 0111, por lo tanto3 | 5su valor es 7.

Nota: los números negativos participan en la operación OR bit a bit en forma de complemento a dos.

Usos:

  1. Establecer ciertos bits en 1: por ejemplo, para establecer losX = 1010 11104 bits bajos de un número en 1, basta con buscar otro númeroY = 0000 1111, y luegoX | Y = 1010 1111se puede obtener.

5. Operador XOR (^)

Definición: realiza la operación "XOR" sobre los bits binarios de los dos datos que participan en la operación.

Regla de operación:

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Resumen: si los bits correspondientes son iguales, el resultado es 0; si son distintos, es 1.

Propiedades:

  1. Propiedad conmutativa
  2. Propiedad asociativa:(a ^ b) ^ c == a ^ (b ^ c)
  3. Para cualquier númerox, se cumple quex ^ x = 0,x ^ 0 = x
  4. Propiedad reflexiva:a ^ b ^ b = a ^ 0 = a

Usos:

  1. Invertir bits específicos: por ejemplo, para invertir losX = 1010 11104 bits bajos de un número, basta con buscar otro númeroY = 0000 1111, y luegoX ^ Y = 1010 0001se puede obtener.
  2. XOR con 0 no cambia el valor: por ejemplo1010 1110 ^ 0000 0000 = 1010 1110
  3. Intercambiar dos números:
void Swap(int &a, int &b) {
if (a != b) {
    a ^= b;
    b ^= a;
    a ^= b;
}
}

6. Operador de complemento a uno (~)

Definición: realiza la operación "complemento" sobre los bits binarios de un solo dato que participa en la operación.

Regla de operación:

~1 = 1111 1110
~0 = 1111 1111

Es decir:

~1 = -2
~0 = -1

Resumen: convierte 0 en 1 y 1 en 0.

Usos:

  1. Hacer que el bit menos significativo de un número sea cero: por ejemplo, para hacer que elabit menos significativo de un número sea 0, se puede expresar como:a & ~1。~1el valor de es1111 1111 1111 1110, y luego con la operación "AND", el bit menos significativo será definitivamente 0.

7. Operador de desplazamiento a la izquierda (<<)

Definición: desplaza todos los bits binarios de un operando a la izquierda cierta cantidad de posiciones; los bits altos se descartan y los bits bajos se rellenan con 0.

Por ejemplo, supongamos que losa = 1010 1110,a = a << 2va aabits binarios de se desplazan 2 posiciones a la izquierda y se rellenan con 0 a la derecha, obteniendo asía = 1011 1000。

Si los bits altos descartados durante el desplazamiento a la izquierda no contienen un 1, entonces cada desplazamiento a la izquierda de una posición equivale a multiplicar el número por 2.

8. Operador de desplazamiento a la derecha (>>)

Definición: desplaza todos los bits binarios de un número a la derecha cierta cantidad de posiciones; los bits altos se rellenan con 0 o con el bit de signo, y los bits de la derecha se descartan.

Por ejemplo,a = a >> 2va aalos bits binarios de se desplazan 2 posiciones a la derecha; se rellenan con 0 o con el bit de signo a la izquierda, dependiendo de si el número es positivo o negativo.

Cada desplazamiento a la derecha de una posición equivale a dividir el número entre 2.

9. Operadores de asignación compuestos

Los operadores de bits se combinan con operadores de asignación para formar nuevos operadores de asignación compuestos, que son:

  • &= Ejemplo:a &= bequivale aa = a & b
  • |= Ejemplo:a |= bequivale aa = a | b
  • >>= Ejemplo:a >>= bequivale aa = a >> b
  • <<= Ejemplo:a <<= bequivale aa = a << b
  • ^= Ejemplo:a ^= bequivale aa = a ^ b

Las reglas de operación son similares a las de los operadores de asignación compuestos mencionados anteriormente.

Operaciones de bits con datos de diferente longitud:

Si dos datos de diferente longitud realizan una operación de bits, el sistema los alinea por el extremo derecho y luego realiza la operación de bits.

Tomando la "operación AND" como ejemplo, se explica a continuación:

En el lenguaje C,longel tipo ocupa 4 bytes,intel tipo ocupa 2 bytes. Si unlongdato de tipo y unintdato de tipo realizan una "operación AND", después de alinear por el extremo derecho, los bits insuficientes de la izquierda se completan según las siguientes tres situaciones:

  1. Si el dato entero es positivo, se añaden 16 ceros a la izquierda.
  2. Si el dato entero es negativo, se añaden 16 unos a la izquierda.
  3. Si el dato entero es sin signo, también se añaden 16 ceros a la izquierda.

Por ejemplo:

long a = 123;
int b = 1;
long result = a & b;
long a = 123;
unsigned int b = 1;
long result = a & b;