为什么答案是42?

时间:2013-12-12 22:00:27

标签: javascript

我试图理解这个回文表达式是如何给出的。我知道运算符优先级规则,但这超出了我当前的Javascript级别。我怎么开始?

alert ("The answer is " +

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

);

2 个答案:

答案 0 :(得分:18)

基本要素如下:

0==0

这是true,可以强制转换为1

a >> b

右移运营商。在这种情况下,它仅在表达式的开头用作0 >> 1,其评估为0

a^b

按位异或。上述两种用法都有ab0,因此结果为非零操作数,强制转换为整数。

[a] + [b]

ab的字符串添加,评估为"ab";如果ab都是数字(例如[0]+[1],则结果可以强制转换为数字。

[a] * [b]

显然,可以对单个元素数组执行乘法运算。所以这相当于a*b

最后,

a << b

左移算子;对于正整数,这有效地乘以2乘以b的幂。在上面的表达式中,它与b = 0一起使用,因此结果为a,强制转换为整数。

如果您应用了正确的操作顺序,则会获得评估为[2] * [21]的{​​{1}}。

答案 1 :(得分:11)

[(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) === 0true强行进入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 === 1true强行进入1

代码使用三个二元运算符:

  • >>是带符号运算符的按位右移:

      

    它将第一个操作数中的所有位向右移动数字   第二个操作数中指定的位置。这些位填写在左侧   取决于原始操作数的符号位,以便保留   结果的标志。如果第一个操作数是正数,则结果   将零置于高位;如果第一个操作数是负数,   结果有一些放在高位。正确地改变价值   一个地方相当于除以2(丢弃剩余部分),   向右移动两个位置相当于整数除以4,并且   等等。

  • <<是带符号运算符的按位左移:

      

    它将第一个操作数中的所有位向左移动数字   第二个操作数中指定的位置。新位填充   零。将值移到一个位置相当于   乘以2,移位两个位置相当于乘法   由4,等等。

  • ^是Bitwise XOR运算符:

      

    它对其每一位执行布尔异或运算   整数参数。异或表示操作数1为真   或操作数二是真的,但不是两者。

有关从List of all binary operators in JavaScripthttp://www.tutorialspoint.com/javascript/javascript_operators.htm获取的二元运算符的信息。

请注意,二元运算符会截断浮点数。