...
- 所有
JavaScript
数字存储为根为10的64(8比特)浮点数。JavaScrip
t不是类型语言。与许多其他编程语言不同,JavaScript
不定义不同类型的数字,比如整数、短、长、浮点等等。
- 整数精度(不使用小数点或指数计数法)最多为15位。小数精度的最大位数是17,但是浮点运算并不总是100% 准确。
- 位运算直接对二进制位进行计算,位运算直接处理每一个比特位,是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能够使用。
- 位运算只对整数起作用,如果一个运算数不是整数,会自动转为整数后再运行。
- 在
JavaScript
内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。
JS中常用的7个位运算符
1. 按位与(AND) &
&
以特定的方式组合操作二进制数中对应的位,如果对应的位都为1,那么结果就是1, 如果任意一个位是0 则结果就是0。
console.log(1 & 3)
2. 按位或(OR) |
|
运算符跟 &
的区别在于如果对应的位中任一个操作数为1 那么结果就是1。
console.log(1 | 3)
3. 按位异或(XOR) ^
^
如果对应两个操作位有且仅有一个1时结果为1,其他都是0。
console.log(1 ^ 3)
4. 按位非(NOT) ~
~
运算符是对位求反,1变0, 0变1,也就是求二进制的反码。
console.log(~ 1)
5. 左移(Left shift)<<
<<
运算符使指定值的二进制数所有位都左移指定次数,其移动规则:丢弃高位,低位补0即按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
console.log(1 << 1)
6. 有符号右移>>
>>
该操作符会将指定操作数的二进制位向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。由于新的最左侧的位总是和以前相同,符号位没有被改变。所以被称作“符号传播”。
console.log(1 >> 1)
7. 无符号右移>>>
>>>
该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。(译注:即便右移 0 个比特,结果也是非负的。)
对于非负数,有符号右移和无符号右移总是返回相同的结果。例如, 9 >>> 2
得到 2 和 9 >> 2
相同。
位运算符在js中的妙用
使用&运算符判断一个数的奇偶
console.log(2 & 1)
console.log(3 & 1)
使用~, >>, <<, >>>, |
来取整
console.log(~~ 6.83)
console.log(6.83 >> 0)
console.log(6.83 << 0)
console.log(6.83 | 0)
console.log(6.83 >>> 0)
使用^
来完成值交换
var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a)
console.log(b)
使用&, >>, |
来完成rgb值和16进制颜色值之间的转换
function hexToRGB(hex) {
var hexx = hex.replace('#', '0x')
var r = hexx >> 16
var g = hexx >> 8 & 0xff
var b = hexx & 0xff
return `rgb(${r}, ${g}, ${b})`
}
function RGBToHex(rgb) {
var rgbArr = rgb.split(/[^\d]+/)
var color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]
return '#'+ color.toString(16)
}
hexToRGB('#ffffff')
RGBToHex('rgb(255,255,255)')
测试了一下,的确位运算符性能比常规的好,1w次测试,用&花费了2.1ms,而%3.5ms。
对于高性能类库或者框架,我支持使用 &, 但是对于快速迭代的业务项目,我支持使用 %,1w次的性能相差1.4ms,在绝大部分业务场景下,性能损耗可以忽略不计,但是可读性损耗程序员的时间成本,却是比较大的。