Considere o script JavaScript a seguir. let x = 16; let y = []; y[2] = x; y[2] %= 3; y[0] = x<<2; y[1] = x <<= 5; alert(y); A execução desse script exibe:
- A)0,128,1
Errada, porque 0, 128 e 1 não correspondem aos resultados das operações de deslocamento e atribuição feitas no script.
- B)2,512,32
Errada, porque 2, 512 e 32 não bate com x << 2 nem com y[2] %= 3.
- C)64,true,1
Errada, porque y[0] não vale 64 e y[1] não vira true, já que o operador <<= retorna número, não booleano.
- D)64,512,1
Certa, pois y[0] fica 64, y[1] recebe 512 após x <<= 5, e y[2] vira 1 com o resto da divisão por 3.
- E)128,64,2
Errada, porque os valores são trocados: x << 2 não gera 128 nesse caso e y[1] não recebe 64.
Gabarito: D
Aqui o ponto central é lembrar que em JavaScript os operadores de deslocamento de bits trabalham com a representação binária dos números. Quando você faz x << 2, está deslocando os bits de x duas posições para a esquerda, o que equivale a multiplicar por 4. Como x vale 16, o resultado é 64. Depois vem a linha y[1] = x <<= 5. Esse operador é composto: primeiro ele atualiza a variável x, e depois devolve o novo valor da expressão. Então x passa de 16 para 16 << 5, isto é, 512. Esse 512 é justamente o valor atribuído a y[1]. Na linha y[2] %= 3, o valor já guardado em y[2] era 16. O operador %= faz o resto da divisão por 3, então 16 % 3 = 1. Resultado final do array: [64, 512, 1]. Em JavaScript, ao exibir um array com alert, os elementos aparecem separados por vírgula. Por isso o gabarito é a letra D. A banca gosta bastante dessa mistura de operador de atribuição composto com deslocamento de bits, porque muita gente calcula só uma parte e esquece que a expressão também altera a própria variável.