Java按位&;操作员多重权限

Java按位&;操作员多重权限,java,bitwise-operators,Java,Bitwise Operators,我正在处理一个JavaWeb应用程序,在一个数据库表中,我有一个类型为number的列。但该列用于存储多个值。(如下图所示) 无=1 视图=2 加法=4 编辑=8 插入=16 删除=32 全部=64 问题 如果该列的值为3-->则我不需要选择任何内容,按 允许 如果该列的值为12-->那么我需要选择add, 编辑 像这样的 我认为我们可以通过位运算符来实现这一点。任何实现这一点的代码都会很棒。首先,您的权限集非常奇怪;“无”和“全部”分开的价值是,呃 好吧,你可以使用一个枚举并依赖序数;这有点老

我正在处理一个JavaWeb应用程序,在一个数据库表中,我有一个类型为number的列。但该列用于存储多个值。(如下图所示)

  • 无=1
  • 视图=2
  • 加法=4
  • 编辑=8
  • 插入=16
  • 删除=32
  • 全部=64 问题

  • 如果该列的值为3-->则我不需要选择任何内容,按 允许
  • 如果该列的值为12-->那么我需要选择add, 编辑
  • 像这样的


    我认为我们可以通过位运算符来实现这一点。任何实现这一点的代码都会很棒。

    首先,您的权限集非常奇怪;“无”和“全部”分开的价值是,呃

    好吧,你可以使用一个枚举并依赖序数;这有点老套,但可以用。示例代码:

    public enum Permission
    {
        NOTHING,
        VIEW,
        ADD,
        EDIT,
        INSERT,
        DELETE,
        ALL,
        ;
    
        private static final Set<Permission> ALL_PERMISSIONS;
    
        static {
            final Set<Permission> set = values();
            set.remove(NOTHING);
            set.remove(ALL);
            ALL_PERMISSIONS = Collections.unmodifiableSet(set);
        }
    
        private static final int NOTHING_ORDINAL = NOTHING.ordinal();
        private static final int ALL_ORDINAL = ALL.ordinal();
    
        public static Set<Permission> fromInt(final int value)
        {
            int mask;
    
            mask = 1 << NOTHING_ORDINAL;
            if (value & mask == mask)
                return Collections.emptySet();
    
            mask = 1 << ALL_ORDINAL;
            if (value & mask == mask)
                return ALL_PERMISSIONS;
    
            final Set<Permission> set = EnumSet.noneOf(Permission.class);
    
            for (final Permission p: ALL_PERMISSIONS) {
                mask = 1 << p.ordinal();
                if (value & mask == mask)
                    set.add(p);
            }
    
            return Collections.unmodifiableSet(set);
        }
    }
    
    公共枚举权限
    {
    没有什么
    看法
    添加
    编辑
    插入
    删去
    全部的
    ;
    私有静态最终设置所有_权限;
    静止的{
    最终设置=值();
    设置。删除(无);
    设置。移除(全部);
    所有_权限=集合。不可修改集(set);
    }
    私有静态final int NOTHING_ORDINAL=NOTHING.ORDINAL();
    私有静态final int ALL_ORDINAL=ALL.ORDINAL();
    公共静态集合fromInt(最终int值)
    {
    int掩模;
    
    mask=1我想你指的是位运算和二进制文字

    在您的情况下,您必须使用位掩码(固定版本,谢谢@Paul Boddington和@Jaroslaw Pawlak):

    请注意:所有可能的位标志都可以独立设置……因此,要么防止一次设置多个位标志,要么处理所有这些情况


    二进制文本:运算符:

    感谢所有的响应。我用bitand运算符创建了一个简单的实用程序,它非常适合上述用例

    问题:

    1)getPermission(3)将不返回任何内容并查看

    public static ArrayList<Integer> getPermission(int day) {
        List<Integer> places = Arrays.asList(1, 2, 4, 8, 16, 32, 64);
        ArrayList<Integer> d = new ArrayList<Integer>();
        for (Integer i : places) {
            if (bitWiseAnd(day, i)) {
                d.add(i);
            }
        }
        return d;
    }
    
    public static boolean bitWiseAnd(int bitwise, int operator) {
        return (bitwise & operator) > 0;
    }
    
    publicstaticarraylistgetpermission(int-day){
    List places=Arrays.asList(1,2,4,8,16,32,64);
    ArrayList d=新的ArrayList();
    用于(整数i:位数){
    如果(按位和(天,i)){
    d、 加(i);
    }
    }
    返回d;
    }
    公共静态布尔位与(整数位,整数运算符){
    返回值(按位和运算符)>0;
    }
    
    为什么“nothing”是一个值?为什么不把0当作“no permissions”?另外,您可以使用枚举来代替,并依赖序数,尽管{de,}序列化它{from,to}数据库可能是一个挑战。为什么“all”是一个不同的值?使用相等运算符的任何问题?<代码> value=3 < /代码>我将考虑使用位集(),并简单地调用<代码> GET()>代码>来检查是否设置了位。?Nothing表示无权限,all表示除Nothing之外的一切。此逻辑取决于顺序枚举值永远相同-否则算法将中断。@Specialit就是这样。请阅读
    EnumSet
    @fge的文档。如果(值和掩码)设置为,则代码中会出现一些错误。添加(p);和if(value&mask==mask)、if(value&mask==mask)。6@specializt修复;是的,序号不会更改。“最坏”的情况是权限集会随时间而更改,但这就是为什么存储“无”和“全部”会适得其反的原因尽可能多的值!@fge:ordinal值将在除末尾以外的任何位置添加项目时发生变化,就像在“插入”和“删除”之间添加新权限一样。不过,我同意,如果未来的开发人员花时间理解枚举,就不应该发生这种情况。这是正确的做法,只是OP应该使用0作为零,并且将所有可能的权限一起使用作为
    掩码
    ,而不是使用硬编码值。相当标准的东西实际上让OP做了一些研究没有“正确”的方法去做……但它是这项工作最快的算法之一——出于可用性的原因,个人可以选择其他算法answer@JoshTriiJohnston是的,但是
    |
    public static ArrayList<Integer> getPermission(int day) {
        List<Integer> places = Arrays.asList(1, 2, 4, 8, 16, 32, 64);
        ArrayList<Integer> d = new ArrayList<Integer>();
        for (Integer i : places) {
            if (bitWiseAnd(day, i)) {
                d.add(i);
            }
        }
        return d;
    }
    
    public static boolean bitWiseAnd(int bitwise, int operator) {
        return (bitwise & operator) > 0;
    }