位运算
将一个整数的二进制格式进行运算。
在JS中如果一个数字进行位运算,那么先将这个数字转换为整数,并且是32位整数存储格式。(与JS本身采用双精度64位存储略有不同)
NaN、Infinity、-Infinity转换为0
与运算 &
运算规则:两个整数比较,如果都为1则结果为1,否则为0。
或运算 |
运算规则:两个整数进行比较,如果有一位为1,则结果为1,否则为0。
非/否运算 ~
运算规则:将该整数的按位取反
非运算快捷方法:-(非运算的数字) - 1
~1 = -1 - 1 = 0
~2 = -2 - 1 = -3
非运算应用-快速取整
优势:位运算的执行速度非常快
取整方法:~~数字
~~1.333 = 1
~~8.9 = 8
异或运算 ^
两个整数进行比较,相同取0,不同取0。
异或运算应用-交换变量
交换a、b
例1:只用加减
var a = 1, b = 2;
a = a + b;
b = a - b; // b = a
a = a - b;
例2:异或运算
var a = 2, b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
位运算的应用-位的叠加(位的开关)
有这样一个权限对象,如下:
var power = {
'read': 0b001,
'write': 0b010,
'modifiy': 0b100
}
添加权限 |
原理解释:每一个权限只占一位且唯一,做或运算就会给对应的位上赋值为1(因为该运算的特性就是有1为1)
// 001 | 010 => 011 => 3
var p = power.read | power.write;
console.log(p) // 3
查看权限 &
原理解释:同1为1,只有对应的位上有该权限才会返回1,否则都会为0
// 011 & 001 => 001 => 1
p & power.read ? console.log('read') : console.log('no read'); // read
// 001 & 010 => 010 => 2
p & power.write ? console.log('write') : console.log('no write'); // write
// 011 & 100 => 000 => 0
p & power.modifiy ? console.log('modifiy') : console.log('no modifiy'); // no modifiy
删除权限 ^
原理解释:先加上对应的权限,在进行去除,这是为了防止之前没有这个权限,导致与运算结果错误
// 011 | 100 => 010
p = p | power.read ^ power.read;
console.log(p) // 2
右移
相当于当前数字除2 有溢出的风险
- 无符号右移 >>
- 有符号右移 >>
左移
相当于当前数字乘2
- 无符号左移 <<
- 有符号左移 <<<