Skip to content

Latest commit

 

History

History
78 lines (67 loc) · 2.15 KB

位运算符的简单运用.md

File metadata and controls

78 lines (67 loc) · 2.15 KB

原理

首先把十进制的数字转化为二进制,进行位运算后在转化为十进制得到最后得值。

类型

常用的位运算符

  1. 按位与(&)
  • 参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。
  1. 按位或(|)
  • 参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
  1. 按位异或(^)
  • 参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。
  1. 取反(~)
  • 参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。
  1. 左移(<<)
  • 参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。
  1. 右移(>>)
  • 参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。

在项目中的简单运用

假设用户对于某一功能有增删改查四个权限,我们怎么用尽量少的数据结构存储用户权限信息,以及处理用户是否具有其中的一个或者多个权限呢?

  • 举个例子

我们假设用户的权限

  • 增加的权限id=2
  • 删除的权限id=4
  • 修改的权限id=8
  • 查找的权限id=16
// 用户已选择的权限
let userCheckPermission = [
  {
    id: 2,
  },
  {
    id: 8,
  }
];

// 用户的所有权限
let permissionArray = [
 {
   id: 2,
   name: '增加'
 },
 {
   id: 4,
   name: '删除'
 },
 {
   id: 8,
   name: '修改'
 },
 {
   id: 16,
   name: '查找'
 }
];

function userPermission(permission = []) {
  // 用户权限的和
  let userAllPermission = 0;
  
  permission.map(i => {
    userAllPermission = userAllPermission | i.id;
  });
  
  permissionArray.forEach(i => {
    if (userAllPermission & i.id) {
      alert(`用户拥有${i.name}的权限`)
    }
  })
}

userPermission(userCheckPermission);