[英]`Math.trunc` vs `|0` vs `<<0` vs `>>0` vs `&-1` vs `^0`
我刚刚发现ES6中有一个新的数学方法: Math.trunc
。
我已经在MDN文章中阅读了它的描述,听起来像是使用|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
Math.trunc(Math.pow(2,31))
和Math.pow(2,31) | 0
怎么样? Math.pow(2,31) | 0
对有符号的32位整数执行按位运算。 因此,当您执行Math.pow(2,31)时,将以位“ 10000000000000000000000000000000000000”获得此表示。 因为此数字必须转换为带符号的32位格式,所以现在在符号位位置有一个1。 这意味着我们正在查看带符号的32位格式的-eve数字。 然后,当我们对0进行按位“或”运算时,将得到带符号的32位形式的相同内容。 十进制为-2147483648。
旁注:以带符号的32位格式可以用二进制表示的小数范围为[10000000000000000000000000000000000000,01111111111111111111111111111111111]。 十进制(以10为底)的范围是[-2147483648,2147483647]。
在许多使用按位运算符的编程语言中,尝试对非整数执行按位运算是一种类型错误:
>>> # 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'
在ECMA-262中 ,数字是双精度64位二进制格式IEEE754。换句话说,JavaScript中没有整数。 只要您要处理的值都适合-(Math.pow(2,32))
和Math.pow(2,31)
位运算是截断浮点值的快速方法。 所有不同的按位运算都执行不同的操作,但是在每个示例中,它们实际上都是在执行标识运算。 关键的区别在于, JavaScript在执行其他操作之前会对值执行ToInt32
操作 。
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.