您的位置:首页 > Web前端 > JavaScript

JS该不该用位运算

2016-04-04 08:52 381 查看
在Google+上看到,Math.floor更快的实现:

源链接:http://programmers.center/resources/r/Faster-alternative-to-Math.floor-260



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有更深入的了解再补吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: