位操作符在我们编码过程中是容易被遗忘的,可能更多的源于我们并不知道这些操作究竟代表什么,或者有什么样的作用,位操作符主要涉及有按位与(&)、按位或(|)、按位非(~)、按位异或(^)、左移(<<)、有符号右移(>>)、无符号右移(>>>),本文主要讲的是按位非(~)。
关于这个位操作的原理,大家可以参考这里。
按位非(~)操作对数值进行操作后,结果为-(N + 1),如:
~2 == -3;//true ~1 == -2;//true ~0 == -1;//true ~-1 == 0;//true
但这个位操作符的最大用途是使用两个按位非操作符来取代Math.floor操作,能够将任何浮点型数值转换成整形。如:
~~2 == Math.floor(2); //true 2 ~~3.5 == Math.floor(3.5);//true 3 ~~2.8 == Math.floor(2.8);//true 2
有人做了一个测试,关于两个按位非操作与Math.floor操作的执行效率问题,如下:
将100000个浮点型数值转换成整型 http://jsperf.com/jsfvsbitnot
# | Browser | Math.floor() | Bitwise double NOT ~~ |
---|---|---|---|
#1 | Firefox 7.0.1 | 42ms | 29ms |
#2 | Firefox 7.0.1 | 44ms | 28ms |
#3 | Chrome 15 | 63ms | 64ms |
#4 | Chrome 15 | 63ms | 68ms |
#5 | IE8 | 265ms | 192ms |
#6 | IE8 | 324ms | 190ms |
使用两个按位非操作的场景:
- 想要将一个浮点型转换成整型
- 与Math.floor相同的操作,但执行更快些
- 尽可能地减少代码量
不使用的场景:
- 当游览器为Chrome的时候
- 想让你的代码可读性好些