Конвертировать строку в битвектор в 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 не обязательно; но это чуть более явно).

Другие вопросы по тегам