1.25 >> 0 结果为什么是 1

想了一下,没想通。MDN上说的会把操作数当作32位整数,即使1.25转为2进制,然后当作整数二进制,他怎么会变成1呢?

阅读 2.3k
3 个回答

首先解释下为什么 ~~ 可以达到 Math.floor() 类似的效果:
关于 ~(位取反),我们可以从 ECMAScript 了解到它的算法,注意到第二步,再进行位取反前,需要先将数值进行 ToInt32 运算,而在 ToInt32 里,有一个 sign(number) * floor(abs(number))——这是取整的操作。

因此用 ~~ 来取整,实际是用 ToInt32 时的取整操作,类似的其他操作(如 num >> 0 ; num | 0)也一样。

但这些操作也有一个很大的问题,就是当需要取整的数超过 32 位里,操作会得到一个错误的值,因为在 ToInt32 里除了取整操作,还把 数值 % 232(转成 32 位数值)。

如 ~~17179869222.23042 == 38(正确取整后的值应该是 17179869222)

这是位运算,>>0就是右移0位,因为js中位运算不能能用与浮点型,所以很多时候都是用>>0来取整的

二进制运算小数部分不参加了吧?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题