Operadores bit a bit (Bitwise) en JavaScript: ¿Qué hacen?

Los operadores bit a bit (bitwise) en JavaScript. ¿Cuáles son y qué son estos operadores? Sirven para realizar operaciones directamente sobre los bits de un número, lo que puede ser muy útil en programación de bajo nivel y optimización de código. En este artículo, exploraremos las características, funciones y ejemplos de estos operadores, descubriendo cómo y cuándo utilizarlos para potenciar tu habilidad en JavaScript.

que son operadores bit a bit en javascript

1. ¿Qué son los operadores bit a bit en JavaScript?

Los operadores bit a bit (o bitwise) en JavaScript operan sobre los bits de los números, en lugar de los valores numéricos completos. Los números en JavaScript se representan en binario (base 2), por lo que estos operadores trabajan manipulando directamente los bits de los números.

¿Qué son los bits de los números? En tan solo 2 minutos, podrás solucionar esta incógnita en el siguiente video sobre los números binarios.

1.1. ¿Para que sirven estos operadores bit a bit (o bitwise) en JavaScript?

Los operadores bit a bit en JavaScript tienen aplicaciones muy útiles, aunque no se usan tan comúnmente como otros operadores en desarrollo web cotidiano. Sin embargo, son esenciales en ciertos casos cuando se busca eficiencia o se trabaja con bajo nivel de datos.

Aquí te explico algunos de sus usos más comunes:

1.1.1. Optimización del rendimiento

  • Los operadores bit a bit permiten realizar operaciones rápidas y eficientes porque trabajan directamente sobre los bits, lo cual puede ser más rápido que las operaciones matemáticas regulares.
  • Se utilizan en programación de sistemas, criptografía, compresión de datos, gráficos computacionales, o para controlar hardware en juegos y dispositivos electrónicos.

1.1.2. Manipulación de banderas o «flags»

  • Un caso muy común es el uso de operadores bit a bit para manejar banderas (flags). En vez de usar múltiples variables booleanas, puedes usar un solo número para representar múltiples estados. Cada bit del número representa un estado (0 o 1), que se puede encender o apagar con operadores bit a bit.

1.1.3. Desplazamientos de bits para cálculos rápidos

  • Los operadores de desplazamiento de bits (<<, >>, >>>) son una forma rápida de multiplicar o dividir números por potencias de dos. Esto se usa en algunas situaciones para mejorar el rendimiento de cálculos matemáticos en lugar de usar operaciones aritméticas normales.

1.1.4. Encriptación y criptografía

  • En algoritmos de encriptación, los operadores bit a bit son fundamentales para mezclar bits y crear claves más seguras. Los algoritmos criptográficos usan operaciones como XOR (^) para combinar datos y claves de manera que los patrones no sean fácilmente detectables.

1.1.5. Procesamiento de gráficos e imágenes

  • En el desarrollo de gráficos, los bits se usan para representar colores, niveles de brillo, transparencia, etc. Los operadores bit a bit permiten manipular directamente estos valores de manera muy eficiente.
  • Ejemplo: Puedes usar operadores bit a bit para extraer o modificar los canales de color (rojo, verde, azul, alfa) en un pixel de una imagen.

1.1.6. Interacción con hardware

  • Cuando programas sistemas que interactúan directamente con hardware, como microcontroladores, sensores, o dispositivos embebidos, a menudo necesitas controlar bits específicos para encender o apagar dispositivos, o leer el estado de registros en un microprocesador.

1.1.7. Compresión y descompresión de datos

  • Los operadores bit a bit se usan en algoritmos que comprimen o descomprimen datos, permitiendo almacenar información más eficientemente al manejar la representación binaria directamente.

1.1.8. Generación de números aleatorios personalizados

  • En algunos algoritmos, como generadores de números pseudoaleatorios, se utilizan operadores como XOR (^) para combinar bits y generar secuencias de números aleatorios.

Resumen de usos principales:

  • Optimización de cálculos matemáticos, especialmente multiplicaciones y divisiones rápidas.
  • Control de banderas (flags) o estados, para compactar varias variables booleanas en un solo número.
  • Manipulación de bits en gráficos, imágenes, o encriptación.
  • Interacción con hardware y programación a nivel de sistema.

En general, los operadores bit a bit son útiles cuando quieres trabajar a un nivel bajo con los datos, para optimizar el rendimiento o cuando manipulas representaciones binarias directamente.

2. ¿Cuáles son los operadores bit a bit en JavaScript?

A continuación dejamos una lista resumen de cada uno de ellos, y luego iremos ampliando sobre cada uno:

  1. AND (&): Realiza una operación AND bit a bit entre dos números.
  2. OR (|): Realiza una operación OR bit a bit entre dos números.
  3. XOR (^): Realiza una operación XOR bit a bit entre dos números.
  4. NOT (~): Invierte los bits de un número (complemento de bits).
  5. Desplazamiento a la izquierda (<<): Desplaza los bits de un número hacia la izquierda.
  6. Desplazamiento a la derecha con signo (>>): Desplaza los bits hacia la derecha conservando el signo.
  7. Desplazamiento a la derecha sin signo (>>>): Desplaza los bits hacia la derecha sin tener en cuenta el signo.

2.1. AND bit a bit (&)

El operador AND bit a bit (&) en JavaScript compara dos números a nivel de bits y devuelve un número en el que cada bit es 1 solo si ambos bits correspondientes en los números originales también son 1. Si alguno de los dos bits es 0, el bit resultante será 0.

Reglas para saber que valor devuelve el operador AND bit a bit (&) al realizar una comparación:

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

2.1.1. Ejemplo para entender como funciona el operador AND bit a bit (&):

Supongamos que tenemos la siguiente estructura usando este operador en los números 5 y 6:

let a = 5;   // 0101 en binario
let b = 6;   // 0110 en binario

let resultado = a & b;  // 0100 en binario, que es 4 en decimal
console.log(resultado);  // Imprime 4Lenguaje del código: JavaScript (javascript)

Como podrás ver, console.log en JavaScript imprime en la consola un resultado igual a 4. ¿Porque?

PASO 1: Representación binaria de los números

Primero, convertimos los números 5 y 6 a su representación binaria (en el video que compartimos en el punto 1 se explica velozmente porque 5 y 6 son iguales a esos números en binario):

  • 5 en binario: 0101
  • 6 en binario: 0110
PASO 2: Aplicar el operador AND bit a bit

Ahora aplicamos el operador AND bit a bit (&), que compara cada bit de los dos números. La regla es que solo será 1 si ambos bits en la misma posición son 1, de lo contrario será 0.

Veamos cómo funciona bit por bit:

ejemplo operador bit a bit and

Aquí está la comparación bit a bit con el operador AND (&) del ejemplo:

  • El primer bit (más a la izquierda): 0 & 0 = 0
  • El segundo bit: 1 & 1 = 1
  • El tercer bit: 0 & 1 = 0
  • El cuarto bit (más a la derecha): 1 & 0 = 0
  • El resultado en binario es 0100, que es 4 en decimal.
PASO 3: Resultado en decimal

El resultado de la operación a & b es 0100 en binario, lo cual equivale a 4 en decimal (nuevamente, en el video del punto 1 podrás entender porque 0100 en numero binario es 4 en decimal).

Resumen del ejemplo:

  • El operador AND bit a bit compara cada bit de los números 5 y 6.
  • Solo aquellos bits que son 1 en ambos números permanecen como 1 en el resultado.
  • En este caso, el resultado final es 0100, que es 4 en decimal.

2.1.2. ¿Para qué se utiliza comúnmente el operador AND bit a bit?

  • Mascaras de bits: Se utiliza para «enmascarar» ciertos bits de un número, es decir, para seleccionar solo aquellos bits que nos interesan.
  • Comprobación de bits: Para verificar si un determinado bit está encendido o apagado en un número.
  • Cálculos lógicos: Se utiliza en operaciones lógicas más complejas, como la implementación de puertas lógicas en circuitos digitales.
  • Optimización de código: En algunos casos, puede ser más eficiente que las operaciones aritméticas tradicionales.

2.2. OR bit a bit (|)

El operador OR bit a bit (|) en JavaScript compara los bits de dos números y devuelve un nuevo número en el que cada bit es 1 si al menos uno de los bits en esa posición es 1. Solo devuelve 0 si ambos bits son 0.

Reglas para saber que valor devuelve el operador OR bit a bit (|) al realizar una comparación:

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

2.2.1. Ejemplo para entender como funciona el operador OR bit a bit (|):

Imagina que quieres aplicar el operador OR entre los números 5 y 6.

La estructura en código sería así:

let a = 5;   // 0101 en binario
let b = 6;   // 0110 en binario

let resultado = a | b;  // 0111 en binario, que es 7 en decimal
console.log(resultado);  // Imprime 7Lenguaje del código: JavaScript (javascript)

Como vemos, el resultado es igual a 7. ¿PORQUÉ?

PASO 1: Convertimos a 5 y 6 en binario:
  1. Número 5 en binario: 0101
  2. Número 6 en binario: 0110
PASO 2: Realizamos la comparación de 5 y 6 en binario usando el operador OR bit a bit:

Si aplicamos 5 | 6, el operador OR compara cada bit de ambos números:

   0101  (5 en binario)
|  
   0110  (6 en binario)
  -------
   0111  (7 en binario)

En cada comparación::

  • Si uno o ambos bits son 1, el resultado en esa posición es 1.
  • Solo será 0 si ambos bits son 0.
  • El resultado en binario es 0111, que es 7 en decimal.

2.2.2. Aplicaciones comunes usando OR bit a bit:

  1. Establecer banderas: Es útil cuando necesitas activar ciertos bits sin modificar otros. Al usar |, puedes «encender» (establecer a 1) ciertos bits sin afectar los demás.
  2. Combinación de permisos: Similar a cómo usas el AND para verificar permisos, puedes usar OR para combinar permisos de usuario u opciones de configuración.
  3. Operaciones en gráficos: En gráficos computacionales, a menudo se usa OR para mezclar colores o componentes de píxeles a nivel binario.
  4. Ajustes de configuración: Puedes utilizar el OR bit a bit para combinar múltiples opciones o configuraciones en una sola variable.

RESUMEN:

  • El operador OR bit a bit (|) establece un bit en 1 si al menos uno de los bits correspondientes de los números de entrada es 1.
  • Es útil cuando necesitas combinar o activar bits sin modificar los que ya están establecidos.

2.3. XOR bit a bit (^)

El operador XOR bit a bit (^) en JavaScript compara los bits de dos números y devuelve un nuevo número en el que cada bit es 1 solo si los bits correspondientes de los dos números son diferentes. Es decir, el resultado será 1 cuando uno de los bits sea 1 y el otro sea 0, y será 0 cuando ambos bits sean iguales.

Reglas para saber que valor devuelve el operador XOR bit a bit (^) al realizar una comparación:

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

2.3.1. Ejemplo para entender como funciona el operador XOR bit a bit (^):

Veamos qué ocurre cuando aplicamos el operador XOR entre los números 5 y 3.

El código seria así:

let a = 5;   // 0101 en binario
let b = 3;   // 0011 en binario

let resultado = a ^ b;  // 0110 en binario, que es 6 en decimal
console.log(resultado);  // Imprime 6Lenguaje del código: JavaScript (javascript)

El resultado es 6. ¿PORQUÉ?:

PASO 1: Convertimos a 5 y 3 en binarios:

Veamos qué ocurre cuando aplicamos el operador XOR entre los números 5 y 3.

  1. Número 5 en binario: 0101
  2. Número 3 en binario: 0011
PASO 2: Realizamos la comparación de 5 y 3 en binario usando el operador XOR bit a bit:

Si aplicamos 5 ^ 3, el operador XOR compara cada bit de ambos números:

0101 (5)
0011 (3)
----
0110 (6)  // Resultado en decimal: 6Lenguaje del código: JavaScript (javascript)

Desglose y comparación bit a bit:

  • Primer bit (más a la izquierda): 0 ^ 0 = 0
  • Segundo bit: 1 ^ 0 = 1
  • Tercer bit: 0 ^ 1 = 1
  • Cuarto bit (más a la derecha): 1 ^ 1 = 0
  • El resultado en binario es 0110, que es 6 en decimal.

2.3.2. Aplicaciones comunes del XOR bit a bit:

  1. Intercambiar valores sin variable auxiliar:
    • El operador XOR es útil para intercambiar dos variables sin necesidad de usar una variable temporal, aunque esta técnica es más común en lenguajes de bajo nivel.
  2. Detección de diferencias:
    • El operador XOR es útil para detectar diferencias entre bits. Si comparas dos valores binarios y aplicas XOR, obtienes 1 en las posiciones donde los bits son diferentes.
  3. Codificación y decodificación simple:
    • XOR se utiliza en algoritmos de codificación simple, donde los datos se codifican al hacer XOR con una clave y se decodifican aplicando XOR nuevamente con la misma clave.
  4. Uso en algoritmos de paridad:
    • XOR se usa en algoritmos de paridad para detectar errores en la transmisión de datos, ya que ayuda a identificar diferencias en bits.

RESUMEN:

  • El operador XOR bit a bit (^) compara dos números a nivel de bits y devuelve 1 cuando los bits en la misma posición son diferentes, y 0 cuando son iguales.
  • Es útil en situaciones como intercambio de valores, codificación y decodificación, detección de diferencias, y en algoritmos de paridad para detección de errores.

2.4. NOT bit a bit (~)

El operador NOT bit a bit (~) en JavaScript es un operador unario que invierte todos los bits de un número. En otras palabras, cambia cada bit de 1 a 0 y de 0 a 1. Esto se conoce como la complementación a uno o complemento de bits.

2.4.1. Funcionamiento del operador NOT bit a bit (~):

  1. Convierte el número en su representación binaria.
  2. Invierte cada bit: 1 se convierte en 0, y 0 se convierte en 1.
  3. El número resultante es el complemento a uno del número original.

2.4.2. Ejemplo para entender como funciona el operador NOT bit a bit (~):

Supongamos que queremos aplicar el operador XOR bit a bit (^) al numero 5:

let a = 5;
let resultado = ~a;
console.log(resultado);  // Imprime -6Lenguaje del código: JavaScript (javascript)

¿Por qué el resultado es negativo igual a -6?

En JavaScript, los números se almacenan en un formato de 32 bits con signo (utilizando el complemento a dos). Cuando inviertes los bits de un número positivo, el resultado suele ser un número negativo. El operador NOT bit a bit genera un número que es equivalente a -(n + 1).

  • Para ~5:
    • El complemento a uno de 5 es -6, ya que se calcula como -(5 + 1).

Aclaremos esta definición….

  1. El número 5 en formato de 32 bits es: 00000000 00000000 00000000 00000101
    • Para simplificar vamos a decir que es: 0101 (nuevamente, en el video que compartimos en el punto 1 se entiende porque 5 es 0101 en binario).
  2. Al usar NOT con 5, invertimos cada bits pero siguiendo el esquema de 32 bits:
ejemplo operador bit a bit not
  1. Como vemos en el ejemplo, se invierten cada bit y el resultado es 11111111 11111111 11111111 11111010, que en decimal equivale a -6.

¿Y PORQUÉ ES NEGATIVO EN -6?

La razón por la que el operador bit a bit NOT (~) aplicado a 5 te da como resultado -6 tiene que ver con la representación de números negativos en complemento a dos en un sistema de 32 bits.

¿Qué es la representación de números negativos en complemento a dos?

En los sistemas modernos, los números negativos se representan utilizando una técnica llamada complemento a dos. Esta técnica permite representar números negativos usando el mismo conjunto de bits que se usa para los números positivos.

En complemento a dos:

  • El primer bit (el bit más a la izquierda) es el bit de signo:
    • Si es 0, el número es positivo.
    • Si es 1, el número es negativo.
  • El resto de los bits se utilizan para representar el valor del número.

Para un número negativo, el valor real se calcula invirtiendo los bits y sumando 1 al resultado.

Entonces, siguiendo la representación de números negativos en complemento a dos, veamos paso a paso porque 11111111 11111111 11111111 11111010 representa el número -6:

PASO 1: El resultado del operador NOT (~):

Cuando aplicas ~5, como dijimos obtienes el siguiente número binario:

~5: 11111111 11111111 11111111 11111010

Este número tiene un 1 en el bit de signo (el bit más a la izquierda), lo que indica que es un número negativo.

PASO 2: Cálculo del número negativo:

Para convertir este número binario en su equivalente decimal negativo (en complemento a dos), seguimos estos pasos:

  1. Inversión de bits: Invertimos nuevamente todos los bits para obtener el número positivo que representa su opuesto:
    • Sería igual a: 00000000 00000000 00000000 00000101 (esto es 5 en binario).
  2. Sumar 1: Al número que obtuviste en el paso anterior, sumamos 1: El resultado es 6.
  3. Aplicamos el signo: Ya que el número original (una vez que aplicamos ~5) tenía un 1 en el bit de signo, sabemos que el resultado final es -6.

Acá dejamos un resumen de por qué ~5 = -6:

  1. El operador NOT (~) invierte todos los bits de 5, resultando en el número binario 11111111 11111111 11111111 11111010.
  2. Ese número se interpreta como un número negativo en complemento a dos.
  3. Para convertirlo a decimal, invertimos los bits (00000000 00000000 00000000 00000101), sumamos 1 (obtenemos 6), y como el número tiene un 1 en el bit de signo, el resultado final es -6.

Es por esto que ~5 da como resultado -6.

¿SE PUEDE HACER ESTE CÁCLUCO DE UNA MANERA MÁS SENCILLA?

Si, recuerda que más arriba dijimos que «El operador NOT bit a bit genera un número que es equivalente a -(n + 1) Siguiendo esta ecuación podemos llegar al mismo resultado.

Siguiendo el ejemplo anterior donde queremos obtener el NOT de ~5, reemplazamos en esta ecuación a 5 por n:

  • -(5 + 1) = -6

2.4.3. Aplicaciones comunes del operador NOT bit a bit:

  1. Inversión de bits: A veces se necesita invertir los bits de un número, por ejemplo, en operaciones de bajo nivel, cifrado, o cuando se manipulan máscaras de bits.
  2. Obtener el complemento a dos: En operaciones binarias o de bajo nivel, el operador NOT se puede utilizar como un paso en la obtención del complemento a dos de un número, lo que es útil para realizar restas con números en sistemas binarios.
  3. Operaciones lógicas: En algunos casos, puede usarse para simplificar operaciones lógicas a nivel de bits.
  4. Optimización de funciones matemáticas: Aunque no es muy común en el desarrollo de aplicaciones web, el operador NOT puede usarse en optimización de ciertos cálculos numéricos o en programación de sistemas, donde el control sobre los bits es más importante.

RESUMEN:

  • El operador NOT bit a bit (~) invierte todos los bits de un número.
  • El resultado de ~n es -(n + 1) debido al uso del complemento a dos para representar números negativos en JavaScript.
  • Es útil en operaciones de bajo nivel, como la manipulación de máscaras de bits o en sistemas donde se requiere el control directo sobre los bits de un número.

2.5. Desplazamiento a la izquierda (<<):

El operador Desplazamiento a la izquierda (<<) en JavaScript desplaza los bits de un número hacia la izquierda un número específico de posiciones. Al mover los bits a la izquierda, los bits más significativos (a la izquierda) se descartan, y se agregan ceros a la derecha. Es una operación que, en términos prácticos, multiplica el número por potencias de dos.

2.5.1. Cómo funciona el operador <<:

  1. Toma un número y lo convierte a su forma binaria.
  2. Desplaza todos los bits hacia la izquierda el número de posiciones indicado.
  3. Los espacios vacíos a la derecha se rellenan con ceros.

2.5.2. Ejemplo para entender como funciona el operador <<:

let a = 5;   // 00000000 00000000 00000000 00000101 en binario
let resultado = a << 1;  // Desplazamos 1 bit a la izquierda
console.log(resultado);  // Imprime 10Lenguaje del código: JavaScript (javascript)

Explicación del ejemplo y porque el resultado es 10:

  1. Número 5 en binario: 0101 (forma abreviada de 00000000 00000000 00000000 00000101)
  2. Al aplicar el operador a << 1 desplazamos los bits una posición a la izquierda:
0101  (5 en binario)
<< 1
1010 (Resultado)
  1. El resultado es 1010 en binario, que equivale a 10 en decimal.

2.5.3. Desplazamiento a la izquierda con más posiciones:

El operador también permite desplazamientos de más de una posición. Cada desplazamiento a la izquierda equivale a multiplicar el número por una potencia de dos. Por ejemplo:

  • a << 2 es equivalente a multiplicar a por 2^2 (o sea, 4).
  • a << 3 es equivalente a multiplicar a por 2^3 (o sea, 8).

2.5.4. Ejemplo desplazando 2 posiciones a la izquierda:

let a = 5;   // 00000000 00000000 00000000 00000101 en binario
let resultado = a << 2;  // Desplazamos 2 bits a la izquierda
console.log(resultado);  // Imprime 20Lenguaje del código: JavaScript (javascript)

El número 5 (00000000 00000000 00000000 00000101) desplazado dos posiciones a la izquierda se convierte en 00000000 00000000 00000000 00010100, que es 20 en decimal.

2.5.5. Aplicaciones comunes del desplazamiento a la izquierda:

  • Multiplicación rápida: En operaciones de bajo nivel o en lenguajes de programación de sistemas, el desplazamiento a la izquierda es una manera eficiente de realizar multiplicaciones por potencias de dos.
  • Codificación y decodificación: En algoritmos de cifrado o manipulación de datos binarios, se usa para ajustar bits o mover valores dentro de estructuras binarias.
  • Control de bits: Al manipular valores a nivel de bits, se puede ajustar qué bits están activos o inactivos en ciertas posiciones.

2.6. Desplazamiento a la derecha con signo (>>):

El operador Desplazamiento a la derecha con signo (>>) en JavaScript desplaza los bits de un número hacia la derecha, conservando el signo del número. Esto significa que los bits vacíos que se generan a la izquierda se rellenan con el bit que represente el signo (si es un número negativo, se rellenan con 1; si es positivo, con 0).

2.6.1. Cómo funciona el operador >>:

  1. Convierte el número en su forma binaria.
  2. Desplaza los bits a la derecha el número de posiciones indicado.
  3. Los bits menos significativos (a la derecha) se descartan, y los bits más significativos (a la izquierda) se rellenan con el bit que representa el signo.

2.6.2. Ejemplo para entender como funciona el operador >>:

let a = 10;   // 00000000 00000000 00000000 00001010 en binario
let resultado = a >> 1;  // Desplazamos 1 bit a la derecha
console.log(resultado);  // Imprime 5Lenguaje del código: JavaScript (javascript)

Pasos, tomamos el número 10 y lo desplazamos 1 posición a la derecha (10 >> 1):

  1. Número 10 en binario: 00000000 00000000 00000000 00001010
  2. Aplicamos el desplazamiento a la derecha, quedaría el siguiente número binario:
    • 00000000 00000000 00000000 00000101
  3. El resultado de este número binario es 5 en decimal.

2.6.3. El operador >> para números negativos:

Con números negativos, el operador conserva el bit del signo, lo que significa que los bits vacíos a la izquierda se rellenan con 1 en lugar de 0.

EJEMPLO:

let a = -10;  // 11111111 11111111 11111111 11110110 en binario
let resultado = a >> 1;  // Desplazamos 1 bit a la derecha
console.log(resultado);  // Imprime -5Lenguaje del código: JavaScript (javascript)

En este ejemplo, queremos desplazar a la derecha en una posición el número negativo -10.

Pasos para entender el ejemplo:

  1. Convertimos el número -10 en binario (en complemento a dos, 32 bits): 11111111 11111111 11111111 11110110
  2. Desplazamos 1 bit a la derecha: 11111111 11111111 11111111 11111011
    • (Recuerda que para pasar un número binario en negativo a decimal se debe seguir la representación de números negativos en complemento a dos, explicada en el punto 2.4.2.).
  3. El resultado de 11111111 11111111 11111111 11111011 es -5 en decimal.

RESUMEN:

  1. El operador Desplazamiento a la derecha con signo (>>) mueve los bits de un número hacia la derecha.
  2. Para números positivos, el bit más significativo (izquierda) se rellena con 0, lo que equivale a dividir el número entre 2 por cada posición de desplazamiento.
  3. Para números negativos, el bit más significativo se rellena con 1, manteniendo el signo negativo del número.
  4. Los bits menos significativos (a la derecha) se descartan.
  5. El desplazamiento a la derecha es equivalente a una división entre potencias de 2, redondeando hacia abajo si es un número negativo.

2.7. Desplazamiento a la derecha sin signo (>>>)

El operador Desplazamiento a la derecha sin signo (>>>) en JavaScript desplaza los bits de un número hacia la derecha, llenando con ceros los bits más significativos (a la izquierda), independientemente de si el número es positivo o negativo.

A diferencia del desplazamiento a la derecha con signo (>>), que conserva el bit de signo, el operador sin signo siempre llena los bits vacíos con ceros, lo que lo hace útil para manejar números como si fueran positivos.

2.7.1. Cómo funciona el operador >>>:

  1. Convierte el número en su forma binaria.
  2. Desplaza los bits a la derecha el número de posiciones indicado.
  3. Los bits vacíos en la parte más significativa (a la izquierda) siempre se rellenan con ceros.

2.7.2. Ejemplo para entender como funciona el operador >>>:

let a = 10;   // 00000000 00000000 00000000 00001010 en binario
let resultado = a >>> 1;  // Desplazamos 1 bit a la derecha sin signo
console.log(resultado);  // Imprime 5Lenguaje del código: JavaScript (javascript)

Este ejemplo, desplaza una posición a la derecha los números binarios, dando como resultado 5. Con un comportamiento igual al del punto 2.6.2.

2.7.3. El operador >>> en JavaScript con un número negativo:

Cuando se usa el operador >>> con números negativos, el número se trata como si fuera un número positivo grande, ya que los bits de signo se rellenan con ceros. Esto genera un número positivo muy grande, ya que el desplazamiento convierte el valor en su equivalente sin signo.

EJEMPLO:

let a = -10;  // 11111111 11111111 11111111 11110110 en binario
let resultado = a >>> 1;  // Desplazamos 1 bit a la derecha sin signo
console.log(resultado);  // Imprime 2147483643Lenguaje del código: JavaScript (javascript)

El resultado es 2147483643 en decimal, ya que el número ahora se interpreta como un entero positivo grande.

¿Porqué? Veámoslo..

  1. Convertimos el número -10 en binario (en complemento a dos, 32 bits): 11111111 11111111 11111111 11110110
  2. Desplazamos 1 bit a la derecha sin signo (porque usamos el operador >>>) y obtenemos el siguiente número: 01111111 11111111 11111111 11111011
    • Como vemos, cada desplazamiento a la derecha con este operador incorpora un 0 a la izquierda, dando como resultado siempre un número positivo y grande.
  3. El resultado es 2147483643 en decimal.

2.7.4. Diferencia con el desplazamiento a la derecha con signo (>>):

  • >>: Conserva el bit de signo al hacer el desplazamiento (rellena con 1 si es negativo, con 0 si es positivo).
  • >>>: Ignora el bit de signo y siempre rellena con ceros, lo que siempre produce un número positivo.

EJEMPLO de comparación entre >> y >>>:

Si desplazamos el número -10 a la derecha con ambos operadores:

let a = -10;
console.log(a >> 1);    // Imprime -5 (mantiene el signo)
console.log(a >>> 1);   // Imprime 2147483643 (sin signo, rellena con ceros)Lenguaje del código: JavaScript (javascript)

RESUMEN:

  1. El operador Desplazamiento a la derecha sin signo (>>>) mueve los bits de un número hacia la derecha.
  2. Los bits vacíos en la parte más significativa (izquierda) se rellenan con ceros, independientemente del signo del número.
  3. Para números positivos, es similar a >> y equivale a dividir entre potencias de 2.
  4. Para números negativos, convierte el número en un valor positivo grande, ya que rellena con ceros en lugar de conservar el bit de signo.
  5. Es útil cuando se necesita manipular los bits de un número sin considerar el signo.

2.7.5. Aplicaciones comunes del desplazamiento a la derecha sin signo:

  • Procesamiento binario: Cuando se necesita trabajar con números sin considerar su signo (como en la manipulación de datos binarios o en sistemas que usan enteros sin signo).
  • Optimización de operaciones matemáticas: Para realizar divisiones rápidas por potencias de 2 sin preocuparse por el signo del número.

3. Preguntas frecuentes y resumen sobre operadores bit a bit (bitwise) en JS.

Los operadores bit a bit (&, |, ^, ~, <<, >>, >>>) trabajan a nivel de bits. Se utilizan en criptografía, compresión de datos y manipulación de banderas, ya que permiten operaciones más rápidas y eficientes.

Los más utilizados son & (AND), | (OR), ^ (XOR), ~ (NOT), << (desplazamiento a la izquierda), >> (desplazamiento a la derecha con signo) y >>> (desplazamiento sin signo).

El operador & compara cada bit de dos números, devolviendo 1 solo si ambos bits son 1. Ejemplo: 5 & 3 devuelve 1 porque 101 & 011 = 001.

El operador | compara cada bit de dos números, devolviendo 1 si al menos uno de los bits es 1. Ejemplo: 5 | 3 devuelve 7 porque 101 | 011 = 111.

El operador ^ devuelve 1 solo si los bits comparados son diferentes. Ejemplo: 5 ^ 3 devuelve 6 porque 101 ^ 011 = 110.

El operador ~ invierte todos los bits de un número, cambiando 0 por 1 y viceversa. Ejemplo: ~5 devuelve -6, debido a la representación en complemento a dos.

El operador << multiplica un número por potencias de 2, y >> divide conservando el signo. Ejemplo: 5 << 1 da 10 y 5 >> 1 da 2.

El operador >>> desplaza los bits a la derecha llenando con ceros. Ejemplo: -5 >>> 1 convierte el número en positivo, mientras que -5 >> 1 conserva el signo.

Se usan en optimización de código, manipulación de banderas, encripción, compresión de datos y gráficos. Permiten operaciones más eficientes que las matemáticas tradicionales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *