首先把十进制的数字转化为二进制,进行位运算后在转化为十进制得到最后得值。
常用的位运算符
- 按位与(&)
- 参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。
- 按位或(|)
- 参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
- 按位异或(^)
- 参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。
- 取反(~)
- 参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。
- 左移(<<)
- 参加运算的两个数,换算为二进制(0、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);