什么是位运算?
我们都知道计算机使用的是二进制。位运算,其实就是直接操作计算机中的二进制。计算机的底层运算就是位运算,所以直接用位运算的执行效率非常快
注意: JS 不区分浮点数和整数,所有数值都以 IEEE-754 64 位格式来存储,但位操作符并不直接操作 64 位的值,而是先将 64 位的值转换为 32 位的整数,再执行操作,最后再将结果转换为 64 位。 因此过大过小的数,浮点数会出现精度损失。
位运算 与 &
例:1&1 = 1,0 & 1=0,0&0=0,1&0=0
位运算 或 |
例: 1 | 0 = 1,0 | 0 = 0, 1 | 1 = 1, 0 | 1 = 1。
位运算 异或 ^
例子:0 ^ 0 = 0. 0 ^ 1 = 1, 1 ^ 1 = 0;
JavaScript 中的按位操作符有:
一些巧用:
- 快速交换两个数
function swap(a, b) {
a = a ^ b;
b = b ^ a;
a = a ^ b;
}
- 正负变化
//正数取反加一就是负数。所以我们正负数转化的规则就是取反加一
function reverse(a) {
return ~ a + 1;
}
- 判断奇偶
//判断最后一位,如果是1就是奇数,如果是0就是偶数。
function isOdd(num) {
if (num & 1) {
console.log("是奇数");
}
}
- 绝对值
正数的绝对值是本身,负数的绝对值是正书
function my_abs(a) {
var i = a >>> 31; // 获取符号位
return i === 0 ? a : ~a + 1;
}
项目中的小应用(权限)
可以通过位运算来定义权限如:
const _bit = {
pmo: 0b0001,//2
admin: 0b0010,//4
member: 0b0100,//8
supervisor: 0b1000//10
};
根据不同操作所需要的权限类别
const authorityAction: any = {
initproduction: _bit.pmo | _bit.admin, //1+2
readOnly: _bit.member,
flow: _bit.member,
createProject: _bit.member,
editCard: _bit.member,
createCard: _bit.member,
jump: _bit.member,
fixProd: _bit.admin,
accessControl: _bit.admin,
migrateCard: _bit.admin,
};
在组件中可以根据key去判断权限,这里定义一个hook
const useAuthority = () => {
//这里可以是一些存在redux的关于权限的信息,比如当前用户是超管还是普通用户
假设默认值为:isPmo、isSupervisor、isMember:{admin:false,member:true},实际得从接口中判断再对其赋值,
再在下面的方法中进行判断。
const hasAuthority = useCallback(
(mykey: string) => {
if (!authorityAction[mykey]) {
return false;
}
if (isSupervisor) {
return true;
}
let _hasAuthority = false;
switch (authorityAction[mykey]) {
case _bit.pmo:
_hasAuthority = isPmo;
break;
case _bit.admin:
_hasAuthority = isMember.admin;
break;
case _bit.pmo | _bit.admin:
_hasAuthority = isMember.admin || isPmo;
break;
case _bit.member:
_hasAuthority = isMember.member;
break;
}
return _hasAuthority;
},
[isPmo, isMember.member, isMember.admin, isSupervisor]
);
return { hasAuthority };
};
组件里调用
const { hasJurisdiction } = useJurisdiction();
hasJurisdiction('editCard') 就可以拿到是否支持做对应的操作