JS该不该用位运算

在Google+上看到,Math.floor更快的实现:
源链接:http://programmers.center/resources/r/Faster-alternative-to-Math.floor-260
JS该不该用位运算_第1张图片

Math.floor的作用是丢弃小数部分,获得整数。

大概只写JS的人理解不了为什么会有这样的语法,然后可能去死记硬背,将来在自己的代码中装装逼,根本原理很简单,写过C的人一扫而知。

这其实就是位运算,是取反操作,位运算直接对内存中的二进制位进行操作(注意,只是对整数),不需要额外的资源占用,因为非常快,很多用C语言(当然还有其他静态语言)写的东西都可以看到源码中大量运用位操作进行优化。

这里只介绍取反操作,至于按位与,按位或,异或,左移右移,请自行搜索。

我用Python和JS实践,~1结果都是 -2
1的二进制是00000000 00000000 00000000 00000001
取反则是11111111 11111111 11111111 11111110

好像JS和Python的整形都是4字节,和C中64位机器的int类型一样——32位。(当然,这取决与编译器的实现)

因此猜想,Python的解释器默认都是把整数当做32位处理,JS也一样,JS还是弱类型,如果没有看过某个JS引擎的源码实现,那对类型系统如何工作的傻傻分不清。

回到正题:
小数是没有位运算的,对小数进行位运算会直接把小数给舍去。
所以~1.111111取反后的结果就是-2,再把-2取反,还是回到1,因此用这种方式实现了比Math.floor更快的运算。

结论:
如果是动态语言,就不要二逼似地用这种方式,你咋不去用C玩。老老实实用标准的方法,你再进行多的位运算优化,也改变不了动态语言的低性能。而且数值太大还会造成不可预见的错误,加上弱类型和各浏览器的实现不同,更加不可预见。用动态语言就老老实实的,不要试图直接去操纵内存,把一切都交给解释器去做。

好像离题了,以后对JS有更深入的了解再补吧。

你可能感兴趣的:(JavaScript,javascript,位运算)