2014-03-03 312 views
5

我剛剛發現在ES6中有一個新的數學方法:Math.trunc`Math.trunc` vs`| 0` vs`<<0` vs `>> 0` vs`&-1` vs`^ 0`

我已閱讀其在MDN article中的描述,聽起來像使用|0

此外,<<0>>0&-1^0也做類似的事情(感謝@kojiro & @Bergi)。

一些測試後,似乎唯一的區別是:

  • Math.trunc回報-0在區間(-1,-0]號碼。按位運算符返回0
  • Math.trunc返回NaN與非數字。按位運算符返回0

是否有更多的差異(其中所有)?


n  | Math.trunc | Bitwise operators 
---------------------------------------- 
42.84 | 42   | 42 
13.37 | 13   | 13 
0.123 | 0   | 0 
0  | 0   | 0 
-0  | -0   | 0 
-0.123 | -0   | 0 
-42.84 | -42  | -42 
NaN | NaN  | 0 
"foo" | NaN  | 0 
void(0)| NaN  | 0 
+1

不要忘了'<< 0', '>> 0','&-1'和'^ 1'。 ;) – kojiro

+0

@kogiro哦,我不知道他們也做同樣的事情,但我猜''0'更常見,因爲它用在asm.js – Oriol

+2

我並不是想暗示他們做的事情完全一樣。他們*不會做同樣的事情,但他們也會做類似的事情,所以如果您將操作進行對比,那麼也值得讓這些東西進入。 – kojiro

回答

4

如何Math.trunc(Math.pow(2,31))Math.pow(2,31) | 0

位運算是在符號的32位整數執行。因此,當您執行Math.pow(2,31)時,您會在「10000000000000000000000000000000」位中得到此表示。由於這個數字必須轉換爲有符號的32位形式,所以我們現在在符號位位置有1。這意味着我們正在以32位有符號形式查看一個-eve數字。然後當我們用0進行按位OR時,我們以簽名的32位格式獲得相同的結果。在十進制中它是-2147483648。

邊注:在符號的32位形成能夠以二進制表示爲是小數的範圍[10000000000000000000000000000000,01111111111111111111111111111111]。在十進制中(以10爲底),這個範圍是[-2147483648,2147483647]。

+0

啊,所以如果生成的整數不適合32位整數,二元運算符失敗(截斷),不是嗎? – Oriol

+2

按位操作在* signed * 32位整數上執行。因此,當您執行Math.pow(2,31)時,您會在「10000000000000000000000000000000」位中得到此表示。由於這個數字必須轉換爲有符號的32位形式,所以我們現在在符號位位置有1。這意味着我們正在以32位有符號形式查看一個-eve數字。然後當我們用0進行按位OR時,我們以簽名的32位格式獲得相同的結果。在十進制中它是-2147483648。 –

1

在具有位運算符許多編程語言,試圖做一個非整數的逐位操作是錯誤類型:

>>> # Python 
>>> 1 << 0; 1.2 << 0 
1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for <<: 'float' and 'int' 

In ECMA-262,一個號是一個雙精度64位的二進制格式IEEE換句話說,JavaScript中沒有整數。只要您處理的值在-(Math.pow(2,32))Math.pow(2,31)之間,那麼按位操作是截斷浮點值的快速方法。所有不同的按位操作都會做不同的事情,但在每個示例中,它們本質上都是在進行身份驗證操作。關鍵的區別在於JavaScript does a ToInt32 operation之前的值不做其他部分。

按位身份操作:

i | 0 // For each bit that is 1, return 1|0. For each bit that is 0, return 0|0. 
i^0 // xor, but effectively same as previous. 
i << 0 // Shift the value left zero bits. 
i >> 0 // Shift the value right zero bits. 
i & -1 // Identity mask 
~~i // Not not - I had forgotten this one above. 
+0

您可能想稍微修改一下Bitwise標識操作。首先,i | 0是一個或運算,並將對每個參數的每一位執行OR比較。由於第二個參數是0,我返回了32位表示。 如果兩個位不同,XOR操作返回1,如果它們相同則返回0,因此它與OR操作符不同。 –

+0

@JamesJensen你能給我一個數字'i'的例子嗎? 0'和'i^0'給出不同的結果? – kojiro

+0

我的歉意。我顯然在邏輯課上失敗了,不知道如何執行異或操作。

相關問題