具有超过32个字节值

时间:2019-02-19 09:42:32

标签: javascript typescript byte bitwise-operators

我的任务是使用按位运算符创建权限系统,有人问我,如果我们需要超过32个权限,该怎么办? 当前,我们有这个:

enum permissions {
    none = 0,
    Founder = 1 << 0,
    SeeAdmins = 1 << 1,
    EditAdmins = 1 << 2,
    SeeText = 1 << 3,
    EditText = 1 << 4,
    PublishWork = 1 << 5
}

这是可管理的,但我们将添加32个以上不是不可思议的,快速测试给了我这些结果:

1 << 30 = 1073741824
1 << 31 = -2147483648
1 << 32 = 1

像这样甚至有可能超过32个字节的值吗?

2 个答案:

答案 0 :(得分:1)

在这种情况下,许可的数量实际上是无限的。但这不涉及二进制掩码,您需要考虑如何在数据库中构造权限。

  1. 如果权限(准确地说是权限组)只是一个数字,那么二进制掩码是可行的方法。由于可以容纳一个数字
  2. 如果您想要更多的灵活性,只需为权限分配随机ID。然后创建具有自己ID的权限组。这样,您实际上拥有无限数量的权限和控件

例如,您可以继续向Permission 枚举添加项目,甚至不给它一个数字。 Typescript will convert that to auto-incrementing numbers。像这样

enum Permissions {
    none,
    Founder,
    SeeAdmins,
    EditAdmins,
    SeeText,
    EditText,
    PublishWork
}

在前端层中,您的“权限组” 可能是一个简单的权限

数组
const accountantPermissionGroup = [
    Permissions.SeeTransactions,
    Permissions.WriteSomeReport,
    Permissions.MoveFunds
];

答案 1 :(得分:1)

BingInt

1n << 64n
18446744073709551616n
  

BigInts支持最常见的运算符。二进制+,-,*和**全部   按预期工作。 /和%工作,并根据需要舍入为零。   按位运算|,&,<<,>>和^执行按位算术   假设负数用二进制补码表示,   就像他们对数字所做的一样。

https://developers.google.com/web/updates/2018/05/bigint