Java 如何使用枚举集在单个字段中组合2位?

Java 如何使用枚举集在单个字段中组合2位?,java,enums,bit-manipulation,enumset,Java,Enums,Bit Manipulation,Enumset,给定一个编码为1字节的二进制字符串,是否可以将该字节的多个位映射到一个枚举值? e、 g:假设我想把我的领域切入这一领域: 位1和位2=字段1 比特3=字段2 比特4=字段3 位5=字段4 其他位未使用 我如何将其映射到,比如: public enum MyEnum { FIELD1, FIELD2, FIELD3, FIELD4; private static final EnumSet<MyEnum> ALLFIELDS = EnumSet.allOf(My

给定一个编码为1字节的二进制字符串,是否可以将该字节的多个位映射到一个枚举值?
e、 g:假设我想把我的领域切入这一领域:

  • 位1和位2=字段1
  • 比特3=字段2
  • 比特4=字段3
  • 位5=字段4
  • 其他位未使用
我如何将其映射到,比如:

public enum MyEnum {
    FIELD1, FIELD2, FIELD3, FIELD4;

    private static final EnumSet<MyEnum> ALLFIELDS = EnumSet.allOf(MyEnum.class);

}
公共枚举MyEnum{
场1、场2、场3、场4;
私有静态final EnumSet ALLFIELDS=EnumSet.allOf(MyEnum.class);
}
我试图做的是使用位掩码过滤掉这些枚举值。为此,我采用了以下方法:

public static <E extends Enum<E>> EnumSet<E> filterWithBitMask(EnumSet<E> set, int bitmask) {
    List<E> kept = new ArrayList<E>();
    for (E property : set) {
        if ((bitmask & (1 << ((Enum<E>) property).ordinal())) != 0) {
            kept.add(property);
        }
    }
    EnumSet<E> selectedProperties = set.clone();
    selectedProperties.retainAll(kept);
    return selectedProperties;
}
带位掩码的公共静态枚举集过滤器(枚举集,int位掩码){
列表保留=新的ArrayList();
对于(E属性:集合){

如果((位掩码&(1不太确定您想要什么。这可能会引起兴趣:

import java.util.*;
enum Field {
    field1((byte) 0xc0) {
        int filter_(byte mask) { // you may want this one to be different
            return mask & this.mask;
        }
    },
    field2((byte) 0x20), field3((byte) 0x10), field4((byte) 0x08);
    Field(byte mask) {
        this.mask = mask;
    }
    int filter_(byte mask) {
        return mask & this.mask;
    }
    static EnumSet<Field> filter(byte mask) {
        final EnumSet<Field> fields = EnumSet.noneOf(Field.class);
        for (Field field : values())
            if (field.filter_(mask) != 0) fields.add(field);
        return fields;
    }
    final byte mask;
}
public class Main {
    public static void main(String[] args) {
        for(Field field:Field.values()) {
            System.out.println(Field.filter(field.mask));
        }
    }
}
import java.util.*;
枚举字段{
字段1((字节)0xc0){
int filter_(字节掩码){//您可能希望这一个不同
返回掩码&this.mask;
}
},
字段2((字节)0x20)、字段3((字节)0x10)、字段4((字节)0x08);
字段(字节掩码){
这个面具=面具;
}
int过滤器(字节掩码){
返回掩码&this.mask;
}
静态枚举集筛选器(字节掩码){
final EnumSet fields=EnumSet.noneOf(Field.class);
对于(字段:values())
如果(字段.过滤器(掩码)!=0)字段.添加(字段);
返回字段;
}
最终字节掩码;
}
公共班机{
公共静态void main(字符串[]args){
for(字段:Field.values()){
System.out.println(Field.filter(Field.mask));
}
}
}

为什么对字段3使用3位?您的意思是字段3最多可以容纳8个不同的值吗?如果字段1有2位,则它可以容纳4个可能的值(00、01、10、11)。除非定义了4个枚举值,每个值对应2位的组合,否则枚举不是正确的表示形式。field3和field4也是如此。@Jim Garrison Maybie我将尝试使用包含8个字段的外部枚举(每个位1个),以及包含我的字段的内部枚举…似乎您的4个字段中的每个字段都需要自己的枚举。您需要一种方法将位提取到4个整数字段中,然后每个字段将映射到其自己的枚举。如果您忘记枚举,只需定义掩码和值,然后使用按位或:
intToCheck |掩码进行测试,这将容易得多==值
import java.util.*;
enum Field {
    field1((byte) 0xc0) {
        int filter_(byte mask) { // you may want this one to be different
            return mask & this.mask;
        }
    },
    field2((byte) 0x20), field3((byte) 0x10), field4((byte) 0x08);
    Field(byte mask) {
        this.mask = mask;
    }
    int filter_(byte mask) {
        return mask & this.mask;
    }
    static EnumSet<Field> filter(byte mask) {
        final EnumSet<Field> fields = EnumSet.noneOf(Field.class);
        for (Field field : values())
            if (field.filter_(mask) != 0) fields.add(field);
        return fields;
    }
    final byte mask;
}
public class Main {
    public static void main(String[] args) {
        for(Field field:Field.values()) {
            System.out.println(Field.filter(field.mask));
        }
    }
}