`Math.trunc` vs` | 0` vs`<< 0` vs`>> 0` vs`& -1` vs` ^ 0`

时间:2014-03-03 20:26:41

标签: javascript math bit-manipulation truncated

我刚刚发现在ES6中有一种新的数学方法:Math.trunc

我已在MDN article中阅读了其说明,听起来像使用|0

此外,<<0>>0&-1^0也做类似的事情(感谢@kojiro&amp; @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

2 个答案:

答案 0 :(得分: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]。

答案 1 :(得分: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,Number是双精度64位二进制格式IEEE 754.换句话说,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.