位运算
位运算基本知识
与运算
符号: &
同位所有值都为1,结果为1,否则结果为0
ts
00001010
&
00000111
--------
00000010
00001010
&
00000111
--------
00000010
或运算
符号: |
同位所有值都为0,结果为,否则结果为1
ts
00001010
|
00000111
--------
00001111
00001010
|
00000111
--------
00001111
非运算
符号: ~ 将每一位取反,即0变1,1变0,包括最前面的符号位也要取反
ts
~00000101
---------
11111010
~00000101
---------
11111010
异或运算
符号: ^ 同位两数相同,结果为0,同位两数不同,结果为1
ts
00001010
^
00000111
--------
00001101
00001010
^
00000111
--------
00001101
左位移运算
符号: << 将二进制数向左移动指定的位数,右侧用0填充
ts
00000101<<2
----------
00010100
00000101<<2
----------
00010100
从十进制来看,n<<m,相当于 n乘以 2的m次方
右位移运算
符号: >> 将二进制数向右移动指定的位数,左侧用原来的最高位填充。
ts
11110110>>2
----------
11111101
11110110>>2
----------
11111101
右位移可能丢失数据
无符号右位移运算
符号: >>> 将二进制数向右移动指定的位数,左侧用0填充。
ts
11110110>>>2
----------
00111101
11110110>>>2
----------
00111101
右位移可能丢失数据
位运算实际应用:做权限控制
ts
// 保存了锁哟可能的权限
const perm = {
read: 0b001,//可读权限
write: 0b010,//可写权限
create:0b100,//创建权限
}
// 变量p中保存可读可写权限(通过或运算添加权限)
let p = perm.read | perm.write
// 去掉可写权限(为了防止报错,先添加可写权限再通过异或运算去掉写权限)
p = p | perm.write ^ perm.write
// 判断权限:p中是否有可读权限
p & perm.read ===perm.read?console.log('可读'):console.log('不可读')
// 保存了锁哟可能的权限
const perm = {
read: 0b001,//可读权限
write: 0b010,//可写权限
create:0b100,//创建权限
}
// 变量p中保存可读可写权限(通过或运算添加权限)
let p = perm.read | perm.write
// 去掉可写权限(为了防止报错,先添加可写权限再通过异或运算去掉写权限)
p = p | perm.write ^ perm.write
// 判断权限:p中是否有可读权限
p & perm.read ===perm.read?console.log('可读'):console.log('不可读')
变量交换
使用中间变量交换
ts
let a = 5
let b = 6
const temp = b
b = a
a = temp
let a = 5
let b = 6
const temp = b
b = a
a = temp
使用ES6结构赋值
ts
let a = 5
let b = 6
[ a , b ] = [ b , a]
let a = 5
let b = 6
[ a , b ] = [ b , a]
使用算数运算(a,b都必须为数字)
ts
let a = 5
let b = 6
a = a + b
b = a - b
a = a - b
let a = 5
let b = 6
a = a + b
b = a - b
a = a - b
可简化为
ts
let a = 5
let b = 6
a = b + ( b = a) - b
let a = 5
let b = 6
a = b + ( b = a) - b
使用位运算的异或运算(a,b都必须为整数)
ts
let a = 5
let b = 6
a = a ^ b
b = a ^ b
a = a ^ b
let a = 5
let b = 6
a = a ^ b
b = a ^ b
a = a ^ b