2012-08-03 2 views
0

비트 변환 문제가있어서 약간 어려움이 있습니다. 약간의 배경 지식 ... 일부 계산 생물학 문제를 해결하고 빠른 저녁 식사 (대용량 데이터 세트 다루기)가 필요합니다. 기본적으로 SNP의 다음 비트 표현을 가지고 있으며 마스크 /와/xor/등을 쓰고 싶습니다. 작업 나는 빨리 하나 개의 표현에서 다음을 변환 할 수 있도록 : 비트 조작 연산자를 사용하는 비트 형식 변환

00

-> 100

01 -> 010

11 -> 001

그래서 예를 들어 00010111는 100010010001로 변환한다 . 나는 약간 큰 java.util.BitSet에 비트를 저장하고 비트 연산자를 사용하여 새로운 형식으로 변환 할 수 있기를 바랍니다.

도움이 될 것입니다.

+0

변환 작업 방법에 대해 자세히 설명해야합니다. 패턴 일치? 스트리밍? 우리는 더 많은 정보가 필요합니다. –

+0

무엇을 시도 했습니까? 이 단어들은 64 비트보다 커야합니까? 그렇다면 비트 조작 기반 솔루션에 만족할 지 확신 할 수 없습니다. [로프] (http://en.wikipedia.org/wiki/Rope_%28computer_science%29)를 사용해 보셨습니까? –

+0

지금 당장 저는 수동으로 작업하고 있습니다. 매 비트마다 2 비트를 추가하고 별도의 BitSet를 2 개 추가하십시오. 그러나이 프로세스는 상당히 느립니다. 나는 새로운 포맷을 생성 할 Entire BitSet에 대한 비트 연산을 한 번에 수행 할 수 있도록 프로 시저를 수정하려고 시도해 왔습니다. –

답변

0

나는 룩업 테이블을 사용할 것입니다. 한 번에 16 비트 씩 잡아서 24 비트 항목이있는 64K 테이블에서 찾으십시오.

int[] table = new int[65536]; 
table[0] = 0b100100100100100100100100; 
table[1] = 0b100100100100100100100010; 
... 
table[65535] = 0b001001001001001001001001; 
BitSet output = new BitSet(); 
for (int i = 0; i < length; i += 16) { 
    int x = (input.get(i) ? 1 : 0) 
      + (input.get(i+1) ? 2 : 0) 
      ... 
      + (input.get(i+15) ? 32768 : 0); 
    int y = table[x]; 
    output.set(i/16*24, (y & 1) != 0); 
    output.set(i/16*24 + 1, ((y>>1) & 1) != 0); 
    ... 
    output.set(i/16*24 + 23, ((y>>23) & 1) != 0); 
} 
1

나는 16 비트에서 24 비트까지의 룩업 테이블을 사용한다.