拥有超过32个字节的值

问题描述 投票:0回答:2

我的任务是使用按位运算符创建权限系统,有人问我,如果我们需要超过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个字节的值这样吗?

javascript typescript byte bitwise-operators
2个回答
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
投票

BigInt有

1n << 64n
18446744073709551616n

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

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

© www.soinside.com 2019 - 2024. All rights reserved.