位运算在项目里的小应用

126 阅读2分钟

什么是位运算?

我们都知道计算机使用的是二进制。位运算,其实就是直接操作计算机中的二进制。计算机的底层运算就是位运算,所以直接用位运算的执行效率非常快

注意: 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') 就可以拿到是否支持做对应的操作

其他文章分享