2013-12-12 74 views
20

我想了解這個迴文表達式是如何給出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)] 

); 
+4

首先打開JavaScript控制檯並查看「true + true」評估的內容。 – Matt

+2

如果您瞭解運算符優先級,那麼您可以將其重寫爲多行,並一次執行一個操作。 – nhgrif

+9

'爲什麼答案是42?'我有一個工作程序來找出問題所在,但需要相當長的時間才能運行... – admdrew

回答

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],其計算結果爲42

+2

>>這是右移操作員沒有離開 – Givi

+0

@Givi哎呀錯字 – Jeremy

+0

@Givi再次感謝。 – Jeremy

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 等

  • ^是按位XOR運算符:

    它執行對其整數參數的每個位執行布爾異或運算。 「異或」表示操作數1爲真 或操作數2爲真,但不是兩者都是。

有關從List of all binary operators in JavaScripthttp://www.tutorialspoint.com/javascript/javascript_operators.htm採取二元運算符的信息。

請注意,二元運算符會截斷浮點數。

+0

可能是值得注意的是移位運算符在移位前截斷浮點。 – Jeremy

+0

你有一個錯字** 0^'20'=== 20('02'強制爲2)**應該是** 0^'20'=== 20('20'強制爲20)** – Givi

+0

@Givi修正,謝謝 – Oriol

相關問題