Skip to content

Latest commit

 

History

History
126 lines (103 loc) · 4.03 KB

位运算.md

File metadata and controls

126 lines (103 loc) · 4.03 KB

摘抄自 JavaScript 中的位运算和权限设计 按位操作符

运算符 用法 描述
按位与(AND) a & b 对于每一个比特位,只有两个操作数相应的比特位都是 1 时,结果才为 1,否则为 0。
按位或(OR) a | b 对于每一个比特位,当两个操作数相应的比特位至少有一个 1 时,结果为 1,否则为 0。
按位异或(XOR) a ^ b 对于每一个比特位,当两个操作数相应的比特位有且只有一个 1 时,结果为 1,否则为 0。
按位非(NOT) ~a 反转操作数的比特位,即 0 变成 1,1 变成 0。
左移(Left shift) a << b 将 a 的二进制形式向左移 b (< 32) 比特位,右边用 0 填充。
有符号右移 a >> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位。
无符号右移 a >>> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。

左移 <<

let a = 1      // 0001
let b = a << 1 // 0010
let c = a << 2 // 0100
let d = a << 3 // 1000

有符号右移 >>

let a = 1      // 0101
let b = a >> 1 // 0010
let c = a >> 2 // 0001
     -9 (base 10): 11111111111111111111111111110111 (base 2)
                   --------------------------------
-9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)

无符号右移 >>>

      9 (base 10): 00000000000000000000000000001001 (base 2)
                   --------------------------------
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

在权限角度,1是有权限,0是没有权限

  • | 是赋予权限
  • & 是校验权限

假设有三种权限,读(r) 写(w) 执行(x)

let r = 0b100  //(二进制表示)  // 4(十进制表示)
let w = 0b010  //(二进制表示)  // 2(十进制表示)
let x = 0b001  //(二进制表示)  // 1(十进制表示)

赋予权限

// 赋予全部权限
let user = r | w | x
// user -> 111

//     r = 0b100
//     w = 0b010
//     r = 0b001
// r|w|x = 0b111

校验权限

let user = r | w
// user = 6
// user = 0b110 (二进制)

console.log((user & r) === r) // true  有 r 权限
console.log((user & w) === w) // true  有 w 权限
console.log((user & x) === x) // false 没有 x 权限

删除权限

  • 无则增,有则减
let r    = 0b100
let w    = 0b010
let x    = 0b001
let user = 0b110 // 有 r w 两个权限

// 执行异或操作,删除 r 权限
user = user ^ r

console.log((user & r) === r) // false 没有 r 权限
console.log((user & w) === w) // true  有 w 权限
console.log((user & x) === x) // false 没有 x 权限

console.log(user.toString(2)) // 现在 user 是 0b010

// 再执行一次异或操作
user = user ^ r

console.log((user & r) === r) // true  有 r 权限
console.log((user & w) === w) // true  有 w 权限
console.log((user & x) === x) // false 没有 x 权限
console.log(user.toString(2)) // 现在 user 又变回 0b110
  • 单纯的删除权限
let r    = 0b100
let w    = 0b010
let x    = 0b001
let user = 0b110 // 有 r w 两个权限

// 删除 r 权限
user = user & (~r)

console.log((user & r) === r) // false 没有 r 权限
console.log((user & w) === w) // true  有 w 权限
console.log((user & x) === x) // false 没有 x 权限

console.log(user.toString(2)) // 现在 user 是 0b010

// 再执行一次
user = user & (~r)

console.log((user & r) === r) // false 没有 r 权限
console.log((user & w) === w) // true  有 w 权限
console.log((user & x) === x) // false 没有 x 权限

console.log(user.toString(2)) // 现在 user 还是 0b010,并不会新增