我想了解這個迴文表達式是如何給出42.我知道運算符優先級規則,但這超出了我目前的Javascript級別。我該如何開始?爲什麼答案是42?
alert ("The answer is " +
[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)]
);
我想了解這個迴文表達式是如何給出42.我知道運算符優先級規則,但這超出了我目前的Javascript級別。我該如何開始?爲什麼答案是42?
alert ("The answer is " +
[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)]
);
的基本要素是如下:
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]
,其計算結果爲42
。
[(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運算符:
它執行對其整數參數的每個位執行布爾異或運算。 「異或」表示操作數1爲真 或操作數2爲真,但不是兩者都是。
有關從List of all binary operators in JavaScript和http://www.tutorialspoint.com/javascript/javascript_operators.htm採取二元運算符的信息。
請注意,二元運算符會截斷浮點數。
首先打開JavaScript控制檯並查看「true + true」評估的內容。 – Matt
如果您瞭解運算符優先級,那麼您可以將其重寫爲多行,並一次執行一個操作。 – nhgrif
'爲什麼答案是42?'我有一個工作程序來找出問題所在,但需要相當長的時間才能運行... – admdrew