JavaScript 中的位运算

本文介绍了JavaScript中的位运算符,如按位与(AND)、按位或(OR)、按位异或(XOR)等,并展示了它们如何用于权限设计。通过位运算,可以方便地赋予、校验和删除权限,例如在读(r)、写(w)和执行(x)权限的管理中。同时,文章通过实例解释了如何利用位运算进行权限的组合与验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘抄自 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,并不会新增
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值