摘抄自 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 //1 let b = a << 1 // 0010 //2 let c = a << 2 // 0100 //4 let d = a << 3 // 1000 //8
-
有符号右移 >>
let a = 5 // 0101 //5 let b = a >> 1 // 0010 //2 常被用来做整除 let c = a >> 2 // 0001 //1
-9 (base 10): 11111111111111111111111111110110 (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 权限
-
删除权限(toggle)
// 无则增,有则减 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
单纯的删除权限(del)
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,并不会新增