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的人一扫而知。
这其实就是位运算,
这里只介绍取反操作
我用Python和JS实践,
取反则是
好像JS和Python的整形都是4字节,和C中64位机器的int类型一样——32位。(当然,这取决与编译器的实现)
因此猜想,Python的解释器默认都是把整数当做32位处理,JS也一样,JS还是弱类型,如果没有看过某个JS引擎的源码实现,那对类型系统如何工作的傻傻分不清。
回到正题:
小数是没有位运算的,对小数进行位运算会直接把小数给舍去。
所以
结论:
如果是动态语言,就不要二逼似地用这种方式,你咋不去用C玩。老老实实用标准的方法,你再进行多的位运算优化,也改变不了动态语言的低性能。而且数值太大还会造成不可预见的错误,加上弱类型和各浏览器的实现不同,更加不可预见。用动态语言就老老实实的,不要试图直接去操纵内存,把一切都交给解释器去做。
好像离题了,以后对JS有更深入的了解再补吧。
源链接: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有更深入的了解再补吧。
相关文章推荐
- JS数据类型检测
- 关于javascript面向对象之闭包
- 纯js+html和纯css+html制作手风琴效果
- javascript拖拽效果延伸学习
- javascript制作照片墙及制作过程中出现的问题
- javascript如何实现360度全景照片问题汇总
- js拖拽的原型声明和用法总结
- javascript控制input只允许输入数字
- JavaScript权威指南4-JS解析器
- JavaScript权威指南5-delete关键字
- JavaScript权威指南6-属性的特性(1)
- 修改JS之后没有效果,比如依然乱码
- JavaScript编写人机对战五子棋(五)
- js知识点 归纳
- javascript正则表达式
- JavaScript编写人机对战五子棋(四)
- JSP Servlet 路径解析 路径设置
- undefined 类型
- 创建优雅表格的8个js工具
- JavaScript编写人机对战五子棋(三)