JavaScript bit a bit


Índice

    Mostrar índice


Operadores JavaScript bit a bit

&

Lógica E. Define cada bit como 1 se ambos os bits forem 1

|

Lógica OU. Define cada bit como 1 se um dos dois bits for 1

^

Lógica XOR. Define cada bit como 1 se apenas um dos dois bits for 1

~

Lógica NÃO. Inverte todos os bits

<<

Preenchimento zero, deslocamento à esquerda. Muda para a esquerda pressionando zeros da direita e deixando os bits mais à esquerda caírem

>>

Mudança à direita assinada. Desloca para a direita empurrando cópias do bit mais à esquerda a partir da esquerda e deixando os bits mais à direita caiu fora

>>>

Preenchimento zero, deslocamento para a direita. Muda para a direita pressionando zeros da esquerda e deixando os bits mais à direita caírem

Exemplos

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 usa operandos bit a bit de 32 bits

JavaScript armazena números como números de ponto flutuante de 64 bits, mas todos bit a bit as operações são realizadas em números binários de 32 bits.

Antes de uma operação bit a bit ser executada, o JavaScript converte números em 32 bits inteiros assinados.

Após a operação bit a bit ser executada, o resultado é convertido novamente para JavaScript de 64 bits números.

Os exemplos acima usam números binários não assinados de 4 bits. Por causa disso ~ 5 retorna 10.

Como o JavaScript usa números inteiros assinados de 32 bits, ele não retornará 10. Ele retornará -6.

00000000000000000000000000101 (5)

1111111111111111111111111111010 (~5=-6)

Um inteiro assinado usa o bit mais à esquerda como sinal de menos.



JavaScript bit a bit E

Quando um AND bit a bit é executado em um par de bits, ele retorna 1 se ambos os bits forem 1.

0 & 0

0

0 & 1

0

1 & 0

0

1 & 1

1

1111 & 0000

0000

1111 & 0001

0001

1111 & 0010

0010

1111 & 0100

0100


JavaScript bit a bit OU

Quando um OR bit a bit é executado em um par de bits, ele retorna 1 se um dos bits for 1:

0 | 0

0

0 | 1

1 | 0

1

1 | 1

1

1111 | 0000

1111

1111 | 0001

1111

1111 | 0010

1111

1111 | 0100

1111


JavaScript XOR bit a bit

Quando um XOR bit a bit é executado em um par de bits, ele retorna 1 se os bits forem diferentes:

0 ^ 0

0

0 ^ 1

1 ^ 0

1

1 ^ 1

1111 ^ 0000

1111

1111 ^ 0001

1110

1111 ^ 0010

1101

1111 ^ 0100

1011


JavaScript bit a bit E (&)

AND bit a bit retorna 1 somente se ambos os bits forem 1:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 & 1

00000000000000000000000000001 (1)

Exemplo

let x = 5 & 1;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise AND</h1>
<h2>The &amp; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 & 1;
</script>

</body>
</html> 

JavaScript bit a bit OU (|)

OR bit a bit retorna 1 se um dos bits for 1:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 | 1

00000000000000000000000000101 (5)

Exemplo

let x = 5 | 1;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise OR</h1>
<h2>The | Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 | 1;
</script>

</body>
</html>

JavaScript XOR bit a bit (^)

XOR bit a bit retorna 1 se os bits forem diferentes:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 ^ 1

00000000000000000000000000100 (4)

Exemplo

let x = 5 ^ 1;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise XOR</h1>
<h2>The ^ Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 ^ 1;
</script>

</body>
</html>

JavaScript bit a bit NÃO (~)

5

00000000000000000000000000000101

~5

1111111111111111111111111111010 (-6)

Exemplo

let x = ~5;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise NOT</h1>
<h2>The ~ Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = ~ 5;
</script>

</body>
</html>

JavaScript (preenchimento zero) deslocamento esquerdo bit a bit (<<)

Este é um deslocamento à esquerda com preenchimento zero. Um ou mais bits zero são inseridos da direita, e os bits mais à esquerda caem:

5

00000000000000000000000000000101

5 << 1

00000000000000000000000001010 (10)

Exemplo

let x = 5 << 1;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise Left</h1>
<h2>The &lt;&lt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 << 1;
</script>

</body>
</html>

JavaScript (preservação de sinal) deslocamento à direita bit a bit (>>)

Este é um sinal que preserva a mudança para a direita. Cópias do bit mais à esquerda são enviadas da esquerda, e os bits mais à direita caem:

-5

11111111111111111111111111111011

-5 >> 1

1111111111111111111111111111101 (-3)

Exemplo

let x = -5 >> 1;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Signed Bitwise Right</h1>
<h2>The &gt;&gt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = -5 >> 1;
</script>

</body>
</html>

JavaScript (preenchimento zero) Shift direito (>>>)

Este é um deslocamento para a direita com preenchimento zero. Um ou mais bits zero são inseridos da esquerda, e os bits mais à direita caem:

5

00000000000000000000000000000101

5 >>> 1

00000000000000000000000000010 (2)

Exemplo

let x = 5 >>> 1;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Unsigned Bitwise Right</h1>
<h2>The &gt;&gt;&gt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 >>> 1;
</script>

</body>
</html>

Números Binários

Números binários com apenas um bit definido são fáceis de entender:

00000000000000000000000000000001

1

00000000000000000000000000000010

2

00000000000000000000000000000100

4

00000000000000000000000000001000

8

00000000000000000000000000010000

16

00000000000000000000000000100000

32

00000000000000000000000001000000

64

Definir mais alguns bits revela o padrão binário:

00000000000000000000000000000101

5 (4 + 1)

00000000000000000000000000001101

13 (8 + 4 + 1)

00000000000000000000000000101101

45 (32 + 8 + 4 + 1)

Os números binários JavaScript são armazenados no formato de complemento de dois.

Isso significa que um número negativo é o NOT bit a bit do número mais 1:

00000000000000000000000000000101

5

11111111111111111111111111111011

-5

00000000000000000000000000000110

6

11111111111111111111111111111010

-6

00000000000000000000000000101000

40

11111111111111111111111111011000

-40

Piada :

Existem apenas 10 tipos de pessoas no mundo: aquelas que entendem binário e aquelas que não entendem.


Convertendo Decimal em Binário

Exemplo

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

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Convert Decimal to Binary</h1>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = dec2bin(-5);
function dec2bin(dec){
  return (dec >>> 0).toString(2);
}
</script>

</body>
</html>

Convertendo Binário em Decimal

Exemplo

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

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Convert Binary to Decimal</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = bin2dec(101);
function bin2dec(bin){
  return parseInt(bin, 2).toString(10);
}
</script>

</body>
</html>