Конвертировать строку в битвектор в Java
Я хочу преобразовать строку в соответствующий ей битовый вектор в соответствии с битовым значением символа (указывается пользователем). Я имею дело со строкой генома, где у меня есть только 4 символа, то есть A,G,C,T. Я хочу представить их со следующим битовым значением в Java
A = 01
G = 11
C = 10
T = 00
Теперь, если задана строка "AGGT", то соответствующее ей битовое значение должно быть 01111100. Я попытался сделать это следующим образом:
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))
}
Что я делаю неправильно? Как это сделать правильно.?
1 ответ
Как отмечает @Thomas, BitSet.set(int)
не работает так, как вы ожидаете.
public void set(int bitIndex)
Устанавливает бит с указанным индексом в true.
Так: G.set(00)
не устанавливает два бита G
в 0
: он устанавливает второй бит (в позиции 1) G
в true
,
Но тогда вы не используете наборы битов, которые вы изначально создали: если вы сталкиваетесь с A
в строке вы фактически устанавливаете 66-й бит (в позиции 65) в true
, поскольку 65 - целочисленное значение буквенного символа '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
не обязательно; но это чуть более явно).