在JavaScript中,整数值没有特殊类型。实际上,所有的数字都有一个Number类型,它是双精度浮点数(IEEE 754),即binary64。
JavaScript中的数值操作的一个问题是,标准中没有定义、整数除法、运算符或函数。
更新:实际上,有一个Math.trunc()函数,但是它的工作速度比二进制解决方案慢2-5倍,而且Internet不支持它。
可以使用一些二进制操作符来实现预期的结果,例如:
(10 / 4) >> 0~~(10 / 4)(10 / 4) | 0以上所有操作都会产生数字2,并且根据我的基准测试,在我的x64机器(Node.js v7.2.1)上具有类似的性能。
请您解释一下,这些二进制操作到底是如何实现这个目的的?有首选的吗?
发布于 2017-01-13 12:39:26
首先,将数字转换到带符号32位整数,这意味着与64位浮点表示相比,您丢失了一些数字。
您的数字的计算只是给出一个浮点值的2.5和操作数首先转换为一个有符号的32位整数,然后进行按位计算。操作数是必需的,因为您需要它来进行初始会话。
2 >> 0 >>的例子
2 (base 10): 00000000000000000000000000000010 (base 2)
--------------------------------
2 >> 0 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)~~2 ~的例子
2 (base 10): 00000000000000000000000000000010 (base 2)
--------------------------------
~2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)
--------------------------------
~~2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)2 | 0 |的例子
2 (base 10): 00000000000000000000000000000010 (base 2)
0 (base 10): 00000000000000000000000000000000 (base 2)
--------------------------------
2 | 0 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)除了将数字转换为整数表示的可能性之外,您还可以使用普通的Math.floor来实现同样的目的,这使得代码看起来并不神秘。
发布于 2017-01-13 12:43:22
这些操作不是将浮点转换为int的简单方法。这些是二进制操作,它工作在整数上。在这个过程中有自动转换。因此,这滥用了将浮点数转换为int的更快的方法。但是,由于这些操作经常在javascript中使用,所以使用它们并没有多大的害处。但是,Math.floor()或Math.truncate ()也可以用于更好的可读性。
发布于 2017-01-13 12:38:56
按位计算的运算符只处理Javascript中的整数,因此执行任何操作都会将值截断为整数。
(10 / 4) >> 0执行除法(10 / 4)以获得值2.5,位移位(>>)只对整数值工作,因此通过在2.5上执行位移位,该值被截断为2。
情况也是如此。
(10 / 4) | 0除了一点移位之外,这个操作是有点明智的。
~~(10 / 4)执行双位方向的否定,第一个截断和否定使2.5变成-3,然后另一个将它转换回正确的符号,2。
您可以在这里阅读有关逐位运算符的更多信息:operators.asp。
https://stackoverflow.com/questions/41634509
复制相似问题