2016-07-21 21 views
0

Ich möchte eine Zeichenfolge in den entsprechenden Bitvektor nach Zeichen-Bit-Wert (benutzerdefiniert) konvertieren. Ich beschäftige mich mit Genomstring, wo ich nur 4 Zeichen habe, d.h. A, G, C, T. Ich möchte, dass sie mit folgenden bitwert in Java repräsentierenKonvertieren String in Bitvektor in Java

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

nun einen String „AGGT“ angegeben wird, wird seine entsprechende bitwert 01111100. sollte ich versucht habe es wie folgt tun:

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))  
} 

Was mache ich falsch? Wie man es richtig macht.

+0

Möchten Sie nur die String-Darstellung oder auch die Zahl? – fge

+0

Sie haben wahrscheinlich das JavaDoc auf 'BitSet' nicht gelesen. Als ein Beispiel sollte "A.set (01)" "A.set (1)" sein, d. H. Sie setzen das Bit einfach auf den Index 1 und belassen das erste Bit auf dem Index 0 unset/0. – Thomas

Antwort

0

Wie von @Thomas bemerkt, funktioniert BitSet.set(int) nicht so, wie Sie es anscheinend erwarten.

public void set(int bitIndex) 

setzt das Bit am angegebenen Index auf true.

So: G.set(00) nicht festgelegt, die zwei Bits von G zu 0: es setzt das zweite Bit (an Position 1) zu dem Gtrue.

Aber Sie verwenden dann nicht die Bitsets, die Sie ursprünglich erstellen: Wenn Sie eine A in der Zeichenfolge finden, setzen Sie tatsächlich das 66. Bit (an Position 65) auf true, da 65 der Ganzzahlwert von ist das Char-Literal 'A'.


Der einfachste Weg wäre, nur einen Schalter in der Schleife zu tun:

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. 
    } 
} 

(Einstellen der Bits false ist nicht notwendig, aber es ist nur ein bisschen mehr explizit).