2016-07-21 6 views
0

문자열을 문자 bitvalue (사용자 지정)에 따라 해당 비트 벡터로 변환하려고합니다. 저는 게놈 문자열을 다루고 있습니다. 여기에는 A, G, C, T라는 4 문자 만 있습니다. 나는 자바에 다음과 bitvalue와 그들을 대표 할 이제 다음과 같이 그 일을 내가 시도 문자열 "AGGT"다음 해당 bitvalue이어야 01111100. 주어진 문자열을 Java의 비트 벡터로 변환

A = 01 
G = 11 
C = 10 
T = 00 

:

BitSet A = new BitSet(2); 
BitSet G = new BitSet(2); 
BitSet C = new BitSet(2); 
BitSet T = new BitSet(2); 
A.set(01); 
G.set(00); 
C.set(11); 
T.set(10); 

String p = "AGGT"; 
BitSet bb = new BitSet(); 
for(int i = 0, n = p.length() ; i < n ; i++) { 
    bb.set(p.charAt(i))  
} 

무엇 내가 잘못하고있는거야? 어떻게 올바른 방식으로 그것을 할 수 있습니다.?

+0

문자열 표현이나 번호 만 사용 하시겠습니까? – fge

+0

아마도'BitSet'에서 JavaDoc을 읽지 않았을 것입니다. 예를 들어'A.set (01)'은'A.set (1)'이어야합니다. 즉, 인덱스 1에 비트를 설정하면 인덱스 0의 첫 번째 비트는 설정되지 않은 상태로 유지됩니다. – Thomas

답변

0

@Thomas가 지적한대로 BitSet.set(int)은 예상대로 작동하지 않습니다.

public void set(int bitIndex) 

true로 지정된 인덱스의 비트를 설정합니다.

: 그래서 G.set(00)G0 중 2 개 비트를 설정하지 않음 : 이는 trueG의 (위치 1에서) 제 2 비트를 설정한다.

그러나 처음에는 생성 한 비트 세트를 사용하지 않습니다. 문자열에 A이있는 경우 실제로 65 번째 비트 (위치 65)를 true으로 설정합니다. 65는 정수 값이므로 char 리터럴 'A'.


가장 쉬운 방법은 그냥 루프에서 스위치를 수행하는 것입니다 :

Bitset bb = new BitSet(2 * p.length()); 
for (int i = 0; i < p.length(); ++i) { 
    switch (p.charAt(i)) { 
    case 'A': 
     bb.set(2*i + 0, false); 
     bb.set(2*i + 1, true); 
     break; 
    case 'G': 
     bb.set(2*i + 0, false); 
     bb.set(2*i + 1, false); 
     break; 
    // etc. 
    } 
} 

(false에 비트 설정이 필요하지 않습니다,하지만 그것은 단지 좀 더 명시 적입니다).

관련 문제