繁体   English   中英

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

[英]`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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM