0

私は列挙型を持っています。

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

4

2 に答える 2

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
}
于 2014-12-11T15:28:48.837 に答える