Java BigInteger和Shift运算符

时间:2014-12-11 15:18:16

标签: java biginteger bit-shift ordinal

我有枚举;

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

2 个答案:

答案 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
}