【问题标题】:Why is the answer 42?为什么答案是 42?
【发布时间】:2013-12-12 22:00:26
【问题描述】:

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

alert ("The answer is " +

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

);

【问题讨论】:

  • 首先打开您的 JavaScript 控制台并查看 true + true 的计算结果。
  • 如果您知道运算符优先级,那么您可以将其重写为多行并一次执行一个操作。
  • Why is the answer 42? 我有一个工作程序可以找出问题所在,但运行起来需要很长时间......
  • 还有。这不是代码。不要写这样的代码。如果您要维护这样编写的代码,请重写它。
  • 另外,我忍不住发帖google's thoughts on this

标签: javascript


【解决方案1】:

基本要素如下:

0==0

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

a >> b

右移运算符。在这种情况下,它仅在表达式的开头使用 0 &gt;&gt; 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],它的计算结果是42

【讨论】:

  • 不客气。我相信,在这种情况下,按位异或用于将字符串转换为数字类型。
【解决方案2】:

[(0&gt;&gt;(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)&lt;&lt;0)] === 42 因为

  • (0&gt;&gt;(0==0))+([0]+[(0==0)+(0==0)]^0) === 2 因为

    • (0&gt;&gt;(0==0)) === 0 因为
      • (0==0) === true
      • (0&gt;&gt;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)&lt;&lt;0) === 21 因为

    • (0^[(0==0)+(0==0)]+[0]) === 20 因为

      • (0==0)+(0==0) === 2
      • [2]+[0] === '20'
      • 0^'20' === 20'20' 强制转换为20
    • ((0==0)&lt;&lt;0) === 1 因为

      • (0==0) === true
      • true&lt;&lt;0 === 1true 强制转换为1

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

  • &gt;&gt; 是带符号运算符的按位右移:

    它将第一个操作数中的所有位向右移动 第二个操作数中指定的位置。左边填写的位 取决于原始操作数的符号位,以保持 结果的标志。如果第一个操作数为正,则结果 在高位有零;如果第一个操作数是负数, 结果有一个放在高位。右移值 一位相当于除以 2(丢弃余数), 右移两位相当于整数除以 4,并且 以此类推。

  • &lt;&lt; 是带符号运算符的按位左移:

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

  • ^ 是按位异或运算符:

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

来自List of all binary operators in JavaScripthttp://www.tutorialspoint.com/javascript/javascript_operators.htm 的二元运算符信息。

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

【讨论】:

  • 可能值得注意的是移位运算符在移位之前截断浮点数。
  • 你有一个错字 0^'20' === 20 ('02' 被强制转换成 2) 应该是 0^'20' === 20 ('20' 强制转换为 20)
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2013-05-26
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多