我试图理解这个回文表达式是如何给出的。我知道运算符优先级规则,但这超出了我当前的Javascript级别。我怎么开始?
alert ("The answer is " +
[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)]
);
答案 0 :(得分:18)
基本要素如下:
0==0
这是true
,可以强制转换为1
。
a >> b
右移运营商。在这种情况下,它仅在表达式的开头用作0 >> 1
,其评估为0
。
a^b
按位异或。上述两种用法都有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]
的{{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) === 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,等等。
^
是Bitwise XOR运算符:
它对其每一位执行布尔异或运算 整数参数。异或表示操作数1为真 或操作数二是真的,但不是两者。
有关从List of all binary operators in JavaScript和http://www.tutorialspoint.com/javascript/javascript_operators.htm获取的二元运算符的信息。
请注意,二元运算符会截断浮点数。