2014-12-11 2 views
0

저는 열거 형을 가졌습니다. 열거를 통해 반복Java BigInteger 및 Shift 연산자

enum testMe { 
    one, 
    two, 
    three; 

    long longValue() { 
     return 1<<ordinal(); 
    } 
} 

for (testMe myLoop = testMe.values()) { 
    System.out.println(value.longValue() + ":" + myLoop); 
} 

정확히 내가 열거의 값의 순서에 변화에 대한 기대 걸 수 있습니다. 그러나 필자는 오랫동안 통과 한 매개 변수에 대해 자격을 부여해야합니다.

Long myLong = 3; 
for (testMe myLoop = testMe.values()) { 
    if ((myLong & value.longValue()) != 0) { 
     System.out.println(value.longValue() + ":" + myLoop); 
    } 
} 

이 경우 1과 2 만 인쇄됩니다. 그러나이 메서드는 열거 형의 32 개 값에만 작동합니다. 누구든지 BigInteger를 사용할 수있는 아이디어가 있습니까 ???

BigInteger longValue() { 
     BigInteger one = BigInteger.valueOf(1); 
     return one.shiftLeft(ordinal()); 

감사합니다 C

+0

사용에 비교'BigInteger.valueOf (2) .pow (서수())'? –

+0

* "BigInteger를 사용할 수있는 방법에 대한 아이디어가있는 사람이 있습니까?"*이 작업을 수행하는 코드를 포함 했으므로이 질문을 실제로 이해하지 못합니다. – Radiodef

+0

어디서 문제가 있습니까? – laune

답변

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 
} 
+0

정말 좋아요! ot.biValue (BigInteger.valueOf (three))가 0이 아닌 것으로 평가하는 방법은 무엇입니까? – cbm64

+0

감사합니다. – cbm64

+0

@ChrisLuff 0과 비교하기위한 부울식이 추가되었습니다. – laune

2

사용 EnumSet.

EnumSet<TestMe> set = new EnumSet<>(TestMe.class); 

각각 EnumSet은 불행하게도 long[] 또는로 발생하지 않습니다하지만 당신이 원하는 비트 속성이 있습니다. 그렇지 않으면 BitSet을 사용하십시오.

+0

'BigSet '은'BigInteger '가 아닌이 목적을 위해 만들어 졌기 때문에 훌륭한 아이디어입니다. – Radiodef

+0

@Radiodef BigInteger에는 setBit 및 shiftLeft가 포함되어 있습니다. 어떻게이 것이 "의도 된 것"이 아니라고 할 수 있습니까? 비트 twiddling의 끝에 * 숫자 * 값을 원하면 BigInteger는 BitSet 또는 EnumSet보다 훨씬 낫습니다. – laune

+0

@laune 죄송합니다. 귀하의 답변이 삭제되었습니다. 내 대답은이 문제가 힘 ** 세트 **를 형성하는 것처럼 보이는 것처럼 교대에 대한 대안을 제시하는 것이었다. 어쩌면 삭제를 취소하고 인내심을 가질 수 있습니다. –