gpt4 book ai didi

javascript - 为什么 :Math. floor(2e+21) != ~~(2e+21)

转载 作者:数据小太阳 更新时间:2023-10-29 04:42:20 25 4
gpt4 key购买 nike

我不是按位运算符的专家,但我经常在比赛中看到程序员使用 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 小于 signed int 的最大正值,所以这是可行的:

~~(2e9)  //2000000000

但是当你转到 2e10 时,它不能使用所有位,所以它只需要最低的 32 位并将其转换为 int:

~~(2e10) //-1474836480

您可以通过使用另一个按位运算符并确认它正在获取最低的 32 位来验证这一点:

2e10 & 0xFFFFFFFF // also -1474836480
~~(2e10 & 0xFFFFFFFF) // also -1474836480

Math.floor 是为计算大数而构建的,因此如果大范围内的准确性很重要,那么您应该使用它。

另请注意:~~ 正在进行 chop ,这与仅对正数进行取整相同。它不适用于底片:

Math.floor(-2.1) // -3
~~(-2.1) // -2

关于javascript - 为什么 :Math. floor(2e+21) != ~~(2e+21),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26595947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com