Подтвердить что ты не робот

Почему ответ 42?

Я пытаюсь понять, как это выражение палиндрома дает 42. Я знаю правила правил приоритета, но это выходит за рамки моего текущего уровня Javascript. Как я могу начать?

alert ("The answer is " +

[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)]

);
4b9b3361

Ответ 1

Основные элементы следующие:

0==0

Это true, которое может быть принудительно введено в 1.

a >> b

Оператор с правым сдвигом. В этом случае он используется только в начале выражения как 0 >> 1, который оценивается как 0.

a^b

Побитовое XOR. Оба вышеприведенных правила имеют либо a, либо b - 0, и поэтому результатом является ненулевой операнд, принудительно введенный в целое число.

[a] + [b]

Добавление строки a и b, оценивается как "ab"; если оба a и b являются числовыми (например, [0]+[1], результат может быть принудительно введен в числовое число.

[a] * [b]

Умножение может выполняться, по-видимому, на одиночных элементарных массивах. Таким образом, это эквивалентно a*b.

Наконец,

a << b

Оператор с левым сдвигом; для положительных целых чисел это эффективно умножает на 2 на степень b. В приведенном выше выражении это используется с b = 0, поэтому результат a, принужденный в целое число.

Если вы применяете правильный порядок операций, вы получаете [2] * [21], который оценивается как 42.

Ответ 2

[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)] === 42, потому что

  • (0>>(0==0))+([0]+[(0==0)+(0==0)]^0) === 2, потому что

    • (0>>(0==0)) === 0, потому что
      • (0==0) === true
      • (0>>true) === 0 (true принудительно в 1)
    • ([0]+[(0==0)+(0==0)]^0) === 2, потому что
      • (0==0)+(0==0) === 2
      • [0]+[2] === '02'
      • '02'^0 === 2 ('02' принудительно в 2)
  • (0^[(0==0)+(0==0)]+[0])+((0==0)<<0) === 21, потому что

    • (0^[(0==0)+(0==0)]+[0]) === 20, потому что

      • (0==0)+(0==0) === 2
      • [2]+[0] === '20'
      • 0^'20' === 20 ('20' принудительно в 20)
    • ((0==0)<<0) === 1, потому что

      • (0==0) === true
      • true<<0 === 1 (true принудительно в 1)

В коде используются три бинарных оператора:

  • >> - Побитовое смещение справа с помощью оператора знака:

    Он перемещает все биты в свой первый операнд справа на количество места, указанные во втором операнде. Биты, заполненные слева зависят от знакового бита исходного операнда, чтобы сохранить знак результата. Если первый операнд положительный, результат имеет нули, помещенные в высокие биты; если первый операнд отрицательный, результат имеет единицы, помещенные в высокие бит. Смещение значения справа одно место эквивалентно делению на 2 (отбрасывание остатка), смещение правых двух мест эквивалентно целочисленному делению на 4, и и так далее.

  • << - Побитовое смещение слева с помощью знака:

    Он перемещает все биты в свой первый операнд слева на количество места, указанные во втором операнде. Новые бит заполняются нули. Смещение значения, оставленного одной позицией, эквивалентно умножая на 2, сдвигая две позиции, эквивалентно умножению на 4 и т.д.

  • ^ - побитовый оператор XOR:

    Он выполняет логическую исключительную операцию ИЛИ на каждом бите ее целочисленные аргументы. Исключительное ИЛИ означает, что либо операнд один верно или операндом два является true, но не оба.

Информация о бинарных операторах, взятых из Список всех двоичных операторов в JavaScript и http://www.tutorialspoint.com/javascript/javascript_operators.htm.

Обратите внимание, что бинарные операторы обрезают плавающие точки.