扫码关注官方订阅号
想了一下,没想通。MDN上说的会把操作数当作32位整数,即使1.25转为2进制,然后当作整数二进制,他怎么会变成1呢?
闭关修行中......
首先解释下为什么 ~~ 可以达到 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来取整的
二进制运算小数部分不参加了吧?
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
因此用 ~~ 来取整,实际是用 ToInt32 时的取整操作,类似的其他操作(如 num >> 0 ; num | 0)也一样。
如 ~~17179869222.23042 == 38(正确取整后的值应该是 17179869222)
这是位运算,>>0就是右移0位,因为js中位运算不能能用与浮点型,所以很多时候都是用>>0来取整的
二进制运算小数部分不参加了吧?