Operaciones bit a bit de JavaScript
Operadores bit a bit de JavaScript
Operator | Name | Description |
---|---|---|
& | AND | Sets each bit to 1 if both bits are 1 |
| | OR | Sets each bit to 1 if one of two bits is 1 |
^ | XOR | Sets each bit to 1 if only one of two bits is 1 |
~ | NOT | Inverts all the bits |
<< | Zero fill left shift | Shifts left by pushing zeros in from the right and let the leftmost bits fall off |
>> | Signed right shift | Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off |
>>> | Zero fill right shift | Shifts right by pushing zeros in from the left, and let the rightmost bits fall off |
Ejemplos
Operation | Result | Same as | Result |
---|---|---|---|
5 & 1 | 1 | 0101 & 0001 | 0001 |
5 | 1 | 5 | 0101 | 0001 | 0101 |
~ 5 | 10 | ~0101 | 1010 |
5 << 1 | 10 | 0101 << 1 | 1010 |
5 ^ 1 | 4 | 0101 ^ 0001 | 0100 |
5 >> 1 | 2 | 0101 >> 1 | 0010 |
5 >>> 1 | 2 | 0101 >>> 1 | 0010 |
JavaScript utiliza operandos bit a bit de 32 bits
JavaScript almacena números como números de coma 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 los números en enteros con signo de 32 bits.
Después de realizar la operación bit a bit, el resultado se vuelve a convertir en números de JavaScript de 64 bits.
Los ejemplos anteriores utilizan números binarios sin signo de 4 bits. Debido a esto, ~ 5 devuelve 10.
Dado que JavaScript usa enteros con signo de 32 bits, no devolverá 10. Devolverá -6.
000000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)
Un entero con signo usa el bit más a la izquierda como el signo menos.
Y bit a bit
Cuando se realiza un AND bit a bit en un par de bits, devuelve 1 si ambos bits son 1.
Operación | Resultado |
---|---|
0 y 0 | 0 |
0 y 1 | 0 |
1 y 0 | 0 |
1 y 1 | 1 |
Operación | Resultado |
---|---|
1111 y 0000 | 0000 |
1111 y 0001 | 0001 |
1111 y 0010 | 0010 |
1111 y 0100 | 0100 |
O bit a bit
Cuando se realiza un OR bit a bit en un par de bits, devuelve 1 si uno de los bits es 1:
Operación | Resultado |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Operación | Resultado |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
XOR bit a bit
Cuando se realiza un XOR bit a bit en un par de bits, devuelve 1 si los bits son diferentes:
Operación | Resultado |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
Operación | Resultado |
---|---|
1111 ^ 0000 | 1111 |
1111 ^ 0001 | 1110 |
1111 ^ 0010 | 1101 |
1111 ^ 0100 | 1011 |
JavaScript bit a bit Y (&)
AND bit a bit devuelve 1 solo si ambos bits son 1:
Decimal | Binario |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 y 1 | 000000000000000000000000000000001 (1) |
Ejemplo
let x = 5 & 1;
JavaScript bit a bit O (|)
Bitwise OR devuelve 1 si uno de los bits es 1:
Decimal | Binario |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 | 1 | 000000000000000000000000000000101 (5) |
Ejemplo
let x = 5 | 1;
JavaScript bit a bit XOR (^)
Bitwise XOR devuelve 1 si los bits son diferentes:
Decimal | Binario |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 ^ 1 | 000000000000000000000000000000100 (4) |
Ejemplo
let x = 5 ^ 1;
JavaScript bit a bit NO (~)
Decimal | Binario |
---|---|
5 | 000000000000000000000000000000101 |
~5 | 111111111111111111111111111111010 (-6) |
Ejemplo
let x = ~5;
JavaScript (Zero Fill) Desplazamiento a la izquierda bit a bit (<<)
Este es un desplazamiento a la izquierda de relleno cero. Se empujan uno o más bits cero desde la derecha, y los bits más a la izquierda caen:
Decimal | Binario |
---|---|
5 | 000000000000000000000000000000101 |
5 << 1 | 000000000000000000000000000001010 (10) |
Ejemplo
let x = 5 << 1;
JavaScript (conservación de signos) Desplazamiento a la derecha bit a bit (>>)
Esta es una señal que preserva el desplazamiento a la derecha. Las copias del bit más a la izquierda se empujan desde la izquierda y los bits más a la derecha se caen:
Decimal | Binario |
---|---|
-5 | 111111111111111111111111111111011 |
-5 >> 1 | 111111111111111111111111111111101 (-3) |
Ejemplo
let x = -5 >> 1;
JavaScript (Zero Fill) 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 más a la derecha se caen:
Decimal | Binario |
---|---|
5 | 000000000000000000000000000000101 |
5 >>> 1 | 000000000000000000000000000000010 (2) |
Ejemplo
let x = 5 >>> 1;
Numeros binarios
Los números binarios con un solo conjunto de bits son fáciles de entender:
Representación binaria | valor decimal |
---|---|
000000000000000000000000000000001 | 1 |
000000000000000000000000000000010 | 2 |
000000000000000000000000000000100 | 4 |
000000000000000000000000000001000 | 8 |
000000000000000000000000000010000 | dieciséis |
000000000000000000000000000100000 | 32 |
000000000000000000000000001000000 | 64 |
Establecer algunos bits más revela el patrón binario:
Representación binaria | valor decimal |
---|---|
000000000000000000000000000000101 | 5 (4 + 1) |
000000000000000000000000000001101 | 13 (8 + 4 + 1) |
000000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Los números binarios de JavaScript se almacenan en formato de complemento a dos.
Esto significa que un número negativo es el NO bit a bit del número más 1:
Representación binaria | valor decimal |
---|---|
000000000000000000000000000000101 | 5 |
111111111111111111111111111111011 | -5 |
000000000000000000000000000000110 | 6 |
111111111111111111111111111111010 | -6 |
000000000000000000000000000101000 | 40 |
111111111111111111111111111011000 | -40 |
Conversión de decimal a binario
Ejemplo
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
Conversión de binario a decimal
Ejemplo
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}