【问题标题】:Convert String into bitvector in java在java中将字符串转换为位向量
【发布时间】:2016-07-21 09:10:24
【问题描述】:

我想根据字符位值(用户指定)将一个字符串转换成其对应的位向量。我正在处理基因组字符串,其中我只有 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))      
}

我做错了什么?如何以正确的方式做到这一点?

【问题讨论】:

  • 你只想要字符串表示还是数字?
  • 您可能没有阅读 BitSet 上的 JavaDoc。例如,A.set(01) 应该是 A.set(1),即您只需将位设置在索引 1 处,而将索引 0 处的第一位设置为未设置/0。

标签: java string bitvector


【解决方案1】:

正如@Thomas 所指出的,BitSet.set(int) 并没有像您预期的那样工作。

public void set(int bitIndex)

将指定索引处的位设置为真。

所以:G.set(00) 不会将G 的两位设置为0:它将G 的第二位(位置1)设置为true

但是您不使用最初创建的位集:如果您在字符串中遇到A,您实际上是在将第 66 位(在位置 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;但它只是更明确一点)。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多