2014-10-09 34 views
0

我想了解Javascript邏輯運算符,並且遇到了2個語句,它們具有seeminlgy類似的功能並試圖瞭解它們之間的區別。那麼,這兩行代碼在JavaScript中有什麼區別? 對於數x,Javascript 32位數字和運算符&和>>>

x >>>= 0; 
x &= 0x7fffffff; 

如果我理解正確的話,他們都應該給32位無符號輸出。然而,對於相同的負值x(即最重要的位總是1),我得到不同的輸出,我錯過了什麼?

由於

+0

是什麼讓你認爲輸出應該是無符號的? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators – 2014-10-09 15:11:59

+0

因爲根據>>>的定義,它從左側移入零。而在'&'操作中,我明確地清除了最重要的符號位。 – kaushal 2014-10-09 15:18:27

+0

順便說一句,這個問題有一些關於>>>運算符的更多細節。 http://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it – kaushal 2014-10-09 15:23:05

回答

1

要截斷的數爲32位,最簡單和最常用的方法是使用「|」按位運算符:

x |= 0; 

如果設置了最高位(位31),JavaScript總是會認爲任何32位計算的結果都是負數。不要讓這打擾你。並且不要清除第31位以試圖使其成爲正面;這不正確地改變了價值。

要轉換的負極32位數爲正值(在範圍爲0〜4294967295的值),則可以做到這一點:

x = x < 0? x + 0x100000000 : x; 

通過添加33位值,自動點登錄位31的擴展被禁止。但是,結果現在超出了有符號的32位範圍。

另一個(整潔)的解決方案是使用無符號右移位運算符具有零移位計數:

x >>>= 0; 

從技術上講,所有的JavaScript數字是64位浮點值,但在現實中,如只要您將數字保留在有符號的32位範圍內,就可以讓JavaScript運行時使用32位整數操作優化您的代碼。

請注意,使用上述任一方法將負32位值轉換爲正值時,本質上會產生33位值,這可能會導致您的JavaScript引擎使用的任何32位優化失敗。