Ale*_*der 7 javascript bitwise-operators
我不是按位运算符的专家,但我经常看到一个模式,在比赛中由256k演示的程序员使用.而不是使用Math.floor()函数,使用双位NOT运算符~~(可能更快?).
像这样:
Math.floor(2.1); // 2
~~2.1 // 2
Run Code Online (Sandbox Code Playgroud)
搜索显示有更多模式使用相同的方式:
2.1 | 0 // 2
2.1 >> 0 // 2
Run Code Online (Sandbox Code Playgroud)
在开发控制台中玩这个时,我注意到了一个我不确定我完全理解的行为.
Math.floor(2e+21); // 2e+21
~~2e+21; // -1119879168
2e+21 | 0; // -1119879168
Run Code Online (Sandbox Code Playgroud)
引擎盖下发生了什么?
正如 Felix King 指出的那样,这些数字正在转换为 32 位有符号整数。2e9 小于有符号 int 的最大正值,所以这是有效的:
~~(2e9) //2000000000
Run Code Online (Sandbox Code Playgroud)
但是当你转到 2e10 时,它不能使用所有位,因此它只需要最低的 32 位并将其转换为 int:
~~(2e10) //-1474836480
Run Code Online (Sandbox Code Playgroud)
您可以通过使用另一个按位运算符并确认它获取最低 32 位来验证这一点:
2e10 & 0xFFFFFFFF // also -1474836480
~~(2e10 & 0xFFFFFFFF) // also -1474836480
Run Code Online (Sandbox Code Playgroud)
Math.floor 是为了计算大数而构建的,因此如果大范围内的精度很重要,那么您应该使用它。
另请注意:~~ 正在进行截断,这与仅对正数进行下限相同。它不适用于底片:
Math.floor(-2.1) // -3
~~(-2.1) // -2
Run Code Online (Sandbox Code Playgroud)