Skip to content

位运算

位运算基本知识

与运算

符号: &
同位所有值都为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

努力成为全干型人才