我不是位运算符的专家,但我经常看到一种模式,该模式在比赛中被256k演示的程序员使用。代替使用Math.floor()
函数,使用双按位NOT运算符~~
(可能更快?)。
像这样:
Math.floor(2.1); // 2
~~2.1 // 2
搜索显示,还有更多使用相同方式的模式:
2.1 | 0 // 2
2.1 >> 0 // 2
在开发控制台中使用此功能时,我注意到我不确定自己是否完全了解这种行为。
Math.floor(2e+21); // 2e+21
~~2e+21; // -1119879168
2e+21 | 0; // -1119879168
幕后发生了什么?
正如Felix King指出的那样,数字正在转换为32位带符号整数。2e9小于一个有符号的int的最大正值,因此可以这样做:
~~(2e9) //2000000000
但是当您转到2e10时,它不能使用所有位,因此它只占用最低的32位并将其转换为int:
~~(2e10) //-1474836480
您可以通过使用另一个按位运算符并确认它正在获取最低的32位来验证这一点:
2e10 & 0xFFFFFFFF // also -1474836480
~~(2e10 & 0xFFFFFFFF) // also -1474836480
Math.floor是为处理大量数字而构建的,因此,如果在较大范围内的准确性很重要,则应使用它。
还要注意:~~正在截断,这与仅对正数的底数相同。它不适用于底片:
Math.floor(-2.1) // -3
~~(-2.1) // -2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句