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:
- 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.
- Obtener los bits específicos de un número: por ejemplo, para obtener los
X = 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. - Determinar par/impar: al determinar si el último bit es 0 o 1 se decide si es par o impar; se puede usar
if ((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:
- Establecer ciertos bits en 1: por ejemplo, para establecer los
X = 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:
- Propiedad conmutativa
- Propiedad asociativa:
(a ^ b) ^ c == a ^ (b ^ c) - Para cualquier número
x, se cumple quex ^ x = 0,x ^ 0 = x - Propiedad reflexiva:
a ^ b ^ b = a ^ 0 = a
Usos:
- Invertir bits específicos: por ejemplo, para invertir los
X = 1010 11104 bits bajos de un número, basta con buscar otro númeroY = 0000 1111, y luegoX ^ Y = 1010 0001se puede obtener. - XOR con 0 no cambia el valor: por ejemplo
1010 1110 ^ 0000 0000 = 1010 1110 - 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:
- Hacer que el bit menos significativo de un número sea cero: por ejemplo, para hacer que el
abit 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:
- Si el dato entero es positivo, se añaden 16 ceros a la izquierda.
- Si el dato entero es negativo, se añaden 16 unos a la izquierda.
- 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;