JavaScript Bitwise Operations

JavaScript Bitwise Operations

Contenido original de W3Schools


JavaScript utiliza operandos bit a bit de 32 bits. JavaScript almacena números como números float de 64 bits, pero todas las operaciones bit a bit se realizan en 32 bits.


Operadores bit a bit de JavaScript

OperadorNombreDescripción
&ANDEstablece cada bit en 1 si ambos bits son 1.
``OREstablece cada bit en 1 si uno de los dos bits es 1.
^XOREstablece cada bit en 1 si sólo uno de dos bits es 1.
~NOTInvierte todos los bits.
<<Desplazamiento a la izquierda de relleno ceroSe desplaza hacia la izquierda empujando ceros desde la derecha y dejando que los bits más a la izquierda se caigan.
>>Desplazamiento a la derecha firmadoSe desplaza hacia la derecha empujando copias del bit más a la izquierda desde la izquierda y deja que los bits más a la derecha se caigan.
>>>Desplazamiento a la derecha de relleno ceroSe desplaza hacia la derecha empujando ceros desde la izquierda y deja que los bits más a la derecha se caigan.

Ejemplos

OperaciónResultadoIgual queResultado
5 & 110101 & 00010001
5150101
~ 510~01011010
5 << 1100101 << 11010
5 ^ 140101 ^ 00010100
5 >> 120101 >> 10010
5 >>> 120101 >>> 10010

JavaScript utiliza operandos bit a bit de 32 bits

JavaScript almacena números como números de punto flotante de 64 bits, pero todas las operaciones bit a bit se realizan en números binarios de 32 bits.

Antes de realizar una operación bit a bit, JavaScript convierte números en enteros de 32 bits con signo.

Una vez realizada la operación bit a bit, el resultado se vuelve a convertir a números JavaScript de 64 bits.

Los ejemplos anteriores utilizan números binarios sin signo de 4 bits. Por esta razón ~ 5 devuelve 10.

Dado que JavaScript utiliza enteros con signo de 32 bits, no devolverá 10. Devolverá -6.

00000000000000000000000000000101 (5)

11111111111111111111111111111010 (~5 = -6)

Un entero con signo utiliza el bit más a la izquierda como signo menos.


JavaScript bit a bit AND

Cuando se realiza un AND bit a bit en un par de bits, devuelve 1 si ambos bits son 1.

Ejemplo de 1 bit:

OperaciónResultado
0 & 00
0 & 10
1 & 00
1 & 11

Ejemplo de 4 bits:

OperaciónResultado
1111 & 00000000
1111 & 00010001
1111 & 00100010
1111 & 01000100

JavaScript bit a bit OR

Cuando se realiza un OR bit a bit en un par de bits, devuelve 1 si uno de los bits es 1:

Ejemplo de 1 bit:

OperaciónResultado
00
01
10
11

Ejemplo de 4 bits:

OperaciónResultado
11110000
11110001
11110010
11110100

JavaScript bit a bit XOR

Cuando se realiza un XOR bit a bit en un par de bits, devuelve 1 si los bits son diferentes:

Ejemplo de 1 bit:

OperaciónResultado
0 ^ 00
0 ^ 11
1 ^ 01
1 ^ 10

Ejemplo de 4 bits:

OperaciónResultado
1111 ^ 00001111
1111 ^ 00011110
1111 ^ 00101101
1111 ^ 01001011

JavaScript bit a bit AND (&)

Bit a bit AND devuelve 1 solo si ambos bits son 1:

DecimalBinario
500000000000000000000000000000101
100000000000000000000000000000001
5 & 100000000000000000000000000000001 (1)

Ejemplo:

let x = 5 & 1;

Ver ejemplo


JavaScript bit a bit OR (|)

Bit a bit OR devuelve 1 si uno de los bits es 1:

DecimalBinario
500000000000000000000000000000101
100000000000000000000000000000001
51

Ejemplo:

let x = 5 | 1;

Ver ejemplo


JavaScript bit a bit XOR (^)

Bit a bit XOR devuelve 1 si los bits son diferentes:

DecimalBinario
500000000000000000000000000000101
100000000000000000000000000000001
5 ^ 100000000000000000000000000000100 (4)

Ejemplo:

let x = 5 ^ 1;

Ver ejemplo


JavaScript bit a bit NOT (~)

DecimalBinario
500000000000000000000000000000101
~511111111111111111111111111111010 (-6)

Ejemplo:

let x = ~5;

Ver ejemplo


JavaScript (relleno cero) Desplazamiento bit a la izquierda (<<)

Este es un desplazamiento a la izquierda con relleno cero. Uno o más bits cero se introducen desde la derecha y los bits más a la izquierda se caen:

DecimalBinario
500000000000000000000000000000101
5 << 100000000000000000000000000001010 (10)

Ejemplo:

let x = 5 << 1;

Ver ejemplo


JavaScript (preservación de signos) Desplazamiento a la derecha en bits (>>)

Este es un signo que preserva el desplazamiento a la derecha. Las copias del bit más a la izquierda se insertan desde la izquierda y los bits más a la derecha se caen:

DecimalBinario
-511111111111111111111111111111011
-5 >> 111111111111111111111111111111101 (-3)

Ejemplo:

let x = -5 >> 1;

Ver ejemplo


JavaScript (relleno cero) Desplazamiento a la derecha (>>>)

Este es un desplazamiento a la derecha de relleno cero. Uno o más bits cero se introducen desde la izquierda y los bits situados más a la derecha se caen:

DecimalBinario
500000000000000000000000000000101
5 >>> 100000000000000000000000000000010 (2)

Ejemplo:

let x = 5 >>> 1;

Ver ejemplo


Numeros binarios

Los números binarios con un solo bit configurado son fáciles de entender:

Representación binariaValor decimal
000000000000000000000000000000011
000000000000000000000000000000102
000000000000000000000000000001004
000000000000000000000000000010008
0000000000000000000000000001000016
0000000000000000000000000010000032
0000000000000000000000000100000064

Configurar algunos bits más revela el patrón binario:

Representación binariaValor decimal
000000000000000000000000000001015 (4 + 1)
0000000000000000000000000000110113 (8 + 4 + 1)
0000000000000000000000000010110145 (32 + 8 + 4 + 1)

Los números binarios de JavaScript se almacenan en formato complemento a dos.

Esto significa que un número negativo es el NOT bit a bit del número más 1:

Representación binariaValor decimal
000000000000000000000000000001015
11111111111111111111111111111011-5
000000000000000000000000000001106
11111111111111111111111111111010-6
0000000000000000000000000010100040
11111111111111111111111111011000-40

Una pequeña broma

Solo hay 10 tipos de personas en el mundo: las que entienden binario y las que no.😄


Convertir decimal a binario

Ejemplo:

function dec2bin(dec){
  return (dec >>> 0).toString(2);
}

Ver ejemplo


Convertir binario a decimal

Ejemplo:

function bin2dec(bin){
  return parseInt(bin, 2).toString(10);
}

Ver ejemplo


W3Schools es el sitio de desarrolladores web más grande del mundo.

Did you find this article valuable?

Support Santos Romero by becoming a sponsor. Any amount is appreciated!