概述
在一个 js 脚本中发现了这样一段代码:
x.fillStyle = '#'+(v(r)*127+128<<16|v(r + u / 3)*127+128<<8|v(r+u/3*2)*127+128).toString(16)
其中出现了 2 个特殊的运算符:<<
和 |
,接触 js 很久了,看到这俩货就懵了。查阅后得知,这是位运算操作。
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。—— 百度百科
位运算符是在数字底层(即表示数字的 32 个数位)进行操作的。原则上位运算的效率会比运算符高。位运算需要一定的计算机原理基础,因为它是对二进制内容的操作。本文收集了一些 js 中常用的位运算技巧。
如果想查看一个数的 2 、8、16 进制,可使用下面的方法:
(10).toString(2) // "1010"
(10).toString(8) // "12"
(10).toString(16) // "a"
javascript 的位运算符介绍没有找到,可以参阅 ECMAScript 位运算符。
按位非【~】
~undefined // -1
~false // -1
~true // -2
~10 // -11
可以用【~】来查找内容:
var str = 'abc';
str.indexOf('b') // 1
str.indexOf('D') // -1
str.indexOf('b') === -1 // false
~str.indexOf('b') // -2
~str.indexOf('D') // 0
~str.indexOf('c') ? '有' : '无' // 有
// ECMAScript
'abc'.includes('b') // true
'abc'.includes('D') // false
'abc'.includes('a') ? '有' : '无' // 有
取整【|】
运算符前后只要有一个为 1,那么结果都为 1,否则就为 0。通常用来取整,个人感觉只是移除了小数部分。
3.14 | 0 // 3
-3.15 | 1 // -3
-0.003 | 2 // 2
3.14 | 2 // 3
3.14 | 16 // 19
Math.floor(3.1515926) // 3, Math.floor 下舍入
Math.ceil(3.1515926) // 4, Math.ceil 上舍入
Math.round(3.1515926) //, 3 Math.round 四舍五入为整数
Math.round(3.5515926) //, 4
右移运算【>>】
>>
运算符可以获取一个数的 1/2 的值。
12 >> 1 // 6
100 >> 1 // 50
200 >> 2 // 50 = 200/2/2
200 >> 3 // 25 = 200/2/2/2
17 >> 1 // 8, 奇数运算结果错误,此处应为 17/2 = 8.5
9 >> 2 // 2, 结果又是错误的,9/2/2 = 2.25
左移运算【<<】
<<
运算符把 x 的所有位向左移 1 位。
14 << 2 // 56,14 (即二进制的 00001110)向左移两位等于 56 (即二进制的 00111000)
x 的 n 次方【**】
2 ** 3 // 8 = Math.pow(2, 3) = 2 的 3 次幂
字符串转数字【+】
+
运算符可以把一个字符串转换为数字。
+'123' // 123
+Math.PI // 3.141592653589793
+'abc' // NaN
网友评论