- Conceptos básicos
- Operaciones de asignación
- Operaciones aritméticas
- Incremento y decremento
- Operaciones de comparación
- Operaciones lógicas
- Operaciones a nivel de bits
- Operaciones de modificación
- Operador ternario condicional
- Coma
- Operadores especiales sizeof y typename
- Agrupación con paréntesis
- Prioridades de las operaciones
Operaciones a nivel de bits
A veces es necesario procesar los números a nivel de bits. Para ello, existe un grupo de operaciones a nivel de bits aplicables a los tipos enteros.
Todos los símbolos y descripciones de los operadores a nivel de bits se proporcionan con su asociatividad y por orden de prioridad en la tabla siguiente.
P |
Símbolos |
Descripción |
Ejemplo |
Orden de ejecución |
---|---|---|---|---|
2 |
~ |
Complemento a nivel de bits (inversión) |
~e1 |
D-I |
5 |
<< |
Desplazamiento a la izquierda |
e1 << e2 |
I-D |
5 |
>> |
Desplazamiento a la derecha |
e1 >> e2 |
I-D |
8 |
& |
AND a nivel de bits |
e1 y e2 |
I-D |
9 |
^ |
OR exclusivo a nivel de bits |
e1 ^ e2 |
I-D |
10 |
| |
OR a nivel de bits |
e1 | e2 |
I-D |
De todo el grupo, sólo la operación '~' de complemento bit a bit es unaria, mientras que todas las demás son binarias.
En todos los casos, si el tamaño del operando es menor que int/uint, este se amplía de forma preliminar a int/uint añadiendo 0 bits en el orden superior. En función del tipo de operando con o sin signo, un bit de orden superior puede afectar al signo.
La aplicación estándar de Windows, Calculadora, puede ayudar a comprender la representación de los números a nivel de bits. Si selecciona el modo de funcionamiento Programador en el menú Ver aparecerán en el programa los grupos de botones de alternancia para seleccionar la representación del número en forma hexadecimal (Hex), decimal (Dec), octal (Oct) o binaria (Bin). Es esta última la que muestra bits. Además, puede seleccionar el tamaño del número: 1, 2, 4 y 8 bytes. Los botones permiten ejecutar todas las operaciones consideradas: Not ('~'), And ('&'), Or ('|'), Xor ('^'), Lsh ('<<') y Rsh ('>>').
Dado que la calculadora utiliza números con signo, pueden aparecer valores negativos al cambiar al modo decimal (recuerde que el bit de orden superior se interpreta como un signo). Para facilitar el análisis es razonable excluir los menos que aparecen, para lo cual es necesario seleccionar el tamaño en bytes un grado superior. Por ejemplo, para comprobar los valores dentro del rango hasta 255 (uchar, entero de un byte sin signo), debe seleccionar 2 bytes (de lo contrario, sólo los valores decimales hasta 127 serán positivos, mientras que los demás se mostrarán en la región negativa).
El complemento a nivel de bits crea un valor en el que el bit 0 ocupa el lugar de todos los bits 1, mientras que el bit 1 ocupa el lugar de los bits 0. Por ejemplo, la negación de un byte con todos los bits cero da un byte con todos los bits 1. El número 50 aparece en el formato a nivel de bits como '00110010' (byte). Su inversión da '11001101'.
La unidad representada hexadecimalmente es 0x0001 (para short). La inversión de estos bits da 0xFFFE (véase el script ExprBitwise.mq5).
short v = ~1; // 0xfffe = -2
|
AND a nivel de bits comprueba cada bit en ambos operandos y, en las posiciones donde se encuentran dos bits establecidos (1), almacena el 1 bit en el resultado. En todos los demás casos (cuando sólo hay un bit establecido en un operando o se restablecen en ambos lugares), el bit 0 se escribe en el resultado.
OR a nivel de bits escribe bits 1 en el resultado si están en las posiciones donde hay un bit establecido en al menos uno de los dos operandos.
El OR exclusivo a nivel de bits escribe en el resultado los bits 1 en las posiciones donde hay un bit establecido en el primer o segundo operando, pero no en ambos a la vez. A continuación se muestra la representación binaria de dos números, X e Y, y los resultados de las operaciones a nivel de bits con ellos.
X 10011010 154
|
Cuando escriba expresiones complejas a partir de varios operadores diferentes, utilice la agrupación con paréntesis para no confundirse con las prioridades.
Las operaciones de desplazamiento desplazan bits a la izquierda ('<<') o a la derecha ('>>') en la cantidad de bits definida en el segundo operando que debe ser un entero no negativo. Como resultado, los bits de la izquierda (para '<<') o de la derecha (para '>>') se eliminan, ya que van más allá de los límites de la celda de memoria. Con el desplazamiento a la izquierda se añade a la derecha el número correspondiente de bits 0. Con el desplazamiento a la derecha, o bien se añaden 0 bits a la izquierda (si el operando es sin signo) o bien se reproduce el bit de signo (si el operando es con signo). En este último caso se añaden 0 bits a la izquierda para los números positivos y 1 bits para los negativos; es decir, se conserva el signo.
short q = v << 5; // 0xffc0 = -64
|
En el ejemplo anterior, el desplazamiento inicial a la izquierda «destruyó» los bits de orden superior de la variable p, mientras que el desplazamiento posterior a la derecha en la misma cantidad de bits los llenó de ceros, lo que llevó a disminuir el valor de 0xffc0 a 0x07fe.
El tamaño del desplazamiento (cantidad de bits) debe ser menor que el del tipo de operando (teniendo en cuenta su extensión potencial). De lo contrario, todos los bits iniciales se perderán.
El desplazamiento de 0 bits no modifica el número.
Las operaciones a nivel de bits '&' y '|' no deben mezclarse con las operaciones lógicas '&&' y '||' (se analizan en la sección anterior).