javascript - universo - ¿Por qué la respuesta es 42?
remove html tags javascript (2)
Estoy tratando de entender cómo esta expresión de palíndromo da 42. Sé sobre las reglas de precedencia del operador, pero esto está más allá de mi nivel actual de Javascript. ¿Cómo puedo empezar?
alert ("The answer is " +
[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)]
);
Los elementos básicos son los siguientes:
0==0
Esto es true
, que puede ser obligado en 1
.
a >> b
El operador de cambio a la derecha. En este caso, solo se usa al comienzo de la expresión como 0 >> 1
que se evalúa como 0
.
a^b
Xwise bitwise. Los dos usos anteriores tienen a
o b
son 0
, por lo que el resultado es un operando distinto de cero, convertido en un entero.
[a] + [b]
La adición de cadena de a
y b
, se evalúa como "ab"
; si tanto a
como b
son numéricos (por ejemplo, [0]+[1]
el resultado se puede convertir en un numérico.
[a] * [b]
La multiplicación se puede realizar en matrices de un solo elemento, al parecer. Entonces esto es equivalente a a*b
.
Finalmente,
a << b
El operador de cambio a la izquierda; para enteros positivos esto efectivamente se multiplica por 2 a la potencia de b
. En la expresión anterior, esto se usa con b = 0
, por lo que el resultado es a
, convertido en un entero.
Si aplica el orden correcto de las operaciones, sale [2] * [21]
que se evalúa a 42
.
[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)] === 42
porque
(0>>(0==0))+([0]+[(0==0)+(0==0)]^0) === 2
porque-
(0>>(0==0)) === 0
porque-
(0==0) === true
-
(0>>true) === 0
(true
coaccionado en1
)
-
-
([0]+[(0==0)+(0==0)]^0) === 2
porque-
(0==0)+(0==0) === 2
-
[0]+[2] === ''02''
-
''02''^0 === 2
(''02''
forzado en2
)
-
-
(0^[(0==0)+(0==0)]+[0])+((0==0)<<0) === 21
porque(0^[(0==0)+(0==0)]+[0]) === 20
porque-
(0==0)+(0==0) === 2
-
[2]+[0] === ''20''
-
0^''20'' === 20
(''20''
forzado en20
)
-
((0==0)<<0) === 1
porque-
(0==0) === true
-
true<<0 === 1
(true
coaccionado en1
)
-
El código utiliza tres operadores binarios:
>>
es el Bitwise Right Shift con Sign Operator:Mueve todos los bits en su primer operando a la derecha por el número de lugares especificados en el segundo operando. Los bits rellenados a la izquierda dependen del bit de signo del operando original, a fin de preservar el signo del resultado. Si el primer operando es positivo, el resultado tiene ceros colocados en los bits altos; Si el primer operando es negativo, el resultado tiene unos colocados en los bits altos. Cambiar un valor a la derecha en un lugar equivale a dividir por 2 (descartar el resto), desplazar a la derecha dos lugares es equivalente a la división de enteros por 4, y así sucesivamente.
<<
es el cambio a la izquierda de Bitwise con operador de señal:Mueve todos los bits en su primer operando a la izquierda por el número de lugares especificados en el segundo operando. Los nuevos bits están llenos de ceros. Cambiar un valor dejado por una posición es equivalente a multiplicar por 2, cambiar dos posiciones es equivalente a multiplicar por 4, etc.
^
es el operador Xwise de Bitwise:Realiza una operación OR exclusiva booleana en cada bit de sus argumentos enteros. Exclusivo O significa que el operando uno es verdadero o el operando dos es verdadero, pero no ambos.
Información sobre operadores binarios tomada de la Lista de todos los operadores binarios en JavaScript y http://www.tutorialspoint.com/javascript/javascript_operators.htm .
Tenga en cuenta que los operadores binarios truncan los puntos flotantes.