位运算的应用场景(前端视角)

280 阅读2分钟

images.png

位运算

位运算不是JS的专属,这是bit操作的基础运算,几乎所有编程语都支持。简单介绍一下位运算,这是来自MDN的一张表。

OperatorUsageDescription
按位与 AND (en-US)a & b在 a,b 的位表示中,每一个对应的位都为 1 则返回 1,否则返回 0.
按位或 OR (en-US)a | b在 a,b 的位表示中,每一个对应的位,只要有一个为 1 则返回 1,否则返回 0.
按位异或 XOR (en-US)a ^ b在 a,b 的位表示中,每一个对应的位,两个不相同则返回 1,相同则返回 0.
按位非 NOT (en-US)~ a反转被操作数的位。
左移 shift (en-US)a << b将 a 的二进制串向左移动 b 位,右边移入 0.
算术右移a >> b把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位。(译注:算术右移左边空出的位是根据最高位是 0 和 1 来进行填充的)
无符号右移 (左边空出位用 0 填充)a >>> b把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位,并把左边空出的位都填充为 0

应用场景

最近一直在想,位运算有什么实际作用呢?常常看到有些大牛把位移运算用在乘法/除法运算上,因为左移一位相当于乘以2,右移一位相当于除以2,总觉得在前端用这种用法太抖机灵了。

不过我还真想到一个真实的用位或可以优雅解决问题的场景,用来做权限限制。

在许多应用程序中,用户的权限可能由多个标志(例如读、写、删除等)组成。使用位运算,可以将不同的权限组合成一个数字,每一位代表一个权限。在用户登录后,前端可以根据该数字使用位运算来检查用户是否具有特定的权限。例如:

const READ_PERMISSION = 1;     // 二进制:0001
const WRITE_PERMISSION = 2;    // 二进制:0010
const DELETE_PERMISSION = 4;   // 二进制:0100

// 设置用户权限
let userPermissions = READ_PERMISSION | WRITE_PERMISSION;

// 检查用户是否有写权限
if (userPermissions & WRITE_PERMISSION) {
  // 执行写操作
}

各位大拿还有什么真实的应用场景,欢迎留言分享。