2017-10-06 2 views
0

알려진 크기이지만 64 비트보다 큰 비트 마스크를 처리 (즉, 모든 비트 연산을 수행) 할 수있는 가장 효율적인 데이터 구조는 무엇입니까?Java - 64 비트보다 빠른 비트 마스크

byte[]? BigInteger? 완전히 다른 것?

자바 7과 호환 될 필요가 빠르게해야한다 (또는 적어도 빨리 합리적으로 예상 할 수있는, 크기 주어진)

if(bitmask & 7 != 0){...} 

bitmask1 |= bitmask2 

등과 같은 것들에 대한 에.

+0

BigInteger를 이러한 모든 과정을 확실히 할 수 사용합니다. 다만, BigInteger의 인스턴스는 불변으로 모든 조작에 의해 새로운 BigInteger 오브젝트가 생성됩니다. 성능이 적절한 지 판단하기 위해 시도해야 할 수도 있습니다. – VGR

답변

3

비트 마스크로 사용할 수있는 기본 숫자의 최대 크기가 실제로 긴 값의 경우 64 비트이기 때문에 직접 처리 할 수 ​​없습니다. 당신이 할 수있는 것은 2 개 이상의 ints 또는 longs로 비트 마스크를 나눈 다음 손으로 관리하는 것입니다.

int[] mask = new int[4]; 
final int MAX_SHIFT = 32; 

void set(int b) { 
    mask[b/MAX_SHIFT] |= 1 << (b % MAX_SHIFT); 
} 

boolean isSet(int b) { 
    return (mask[b/MAX_SHIFT] & (1 << (b % MAX_SHIFT))) != 0; 
} 

은 또는 당신은 비트 세트

BitSet bitSet = new BitSet(101); 
bitSet.set(100); 
+0

그래, BitSet 충분히 빠르며, 좋은 작업이 있습니다. 비록 _shifting_ 비트는 아니지만. –

+0

오른쪽 이동을위한 @JoopEggen, 적어도 거기에 대한 해결책이 있습니다. https://stackoverflow.com/questions/9008150/shifting-a-java-bitset (그들은 왼쪽 교대라고 부르지 만, 왼쪽 교대는 나를 위해 다른 방향으로 간다). 왼쪽 쉬프트의 경우 솔루션을 즉시 보지 않고 "BitSet"을 확장하고 저장된 값을 일정량만큼 증가시키는 메소드를 추가합니다. 너? – User1291

+0

@ User1291은 원래 비트 세트의 하위 범위로 보이지만 재 색인화되지는 않습니다. 시작 인덱스 오프셋을 유지하는 경우 적어도 시프 팅의 일부 (왼쪽 또는 오른쪽으로 지워짐). –

관련 문제