我有枚举;
enum testMe {
one,
two,
three;
long longValue() {
return 1<<ordinal();
}
}
for (testMe myLoop = testMe.values()) {
System.out.println(value.longValue() + ":" + myLoop);
}
通过枚举循环给出了我对枚举值的序数转换的期望。但是,我需要对我在long中传递的参数进行限定;
Long myLong = 3;
for (testMe myLoop = testMe.values()) {
if ((myLong & value.longValue()) != 0) {
System.out.println(value.longValue() + ":" + myLoop);
}
}
在这种情况下,只打印One和Two。但是,此方法仅适用于枚举中的32个值。有没有人有任何想法如何使用BigInteger ???
BigInteger longValue() {
BigInteger one = BigInteger.valueOf(1);
return one.shiftLeft(ordinal());
谢谢C
答案 0 :(得分:2)
使用EnumSet。
EnumSet<TestMe> set = new EnumSet<>(TestMe.class);
EnumSet具有您想要的位属性,但遗憾的是它不会显示为long[]
等。否则请使用BitSet
。
答案 1 :(得分:2)
BigInteger b =BigInteger.ZERO;
b = b.setBit( ordinal() );
您也可以使用BigInteger.and(BigInteger x)。
enum OneTwo {
one,
two,
three;
BigInteger biValue() {
BigInteger bi = BigInteger.ZERO;
return bi.setBit(ordinal());
}
BigInteger biValue( BigInteger filter ) {
BigInteger bi = BigInteger.ZERO;
return bi.setBit(ordinal()).and(filter);
}
}
测试:
BigInteger three = BigInteger.valueOf(3L);
for (OneTwo ot: OneTwo.values()) {
System.out.println( ot.biValue() + ":" + ot);
System.out.println( ot.biValue(three) + ":" + ot);
}
打印没问题。
或与零比较
if( BigInteger.ZERO.equals( bi.setBit(ordinal()).and(filter) ) ){
// no bits in filter are set
}