0

少し苦労している変換の問題が少しあります。ちょっとしたバックグラウンド... いくつかの計算生物学の問題に取り組んでいるため、超高速である必要があります (大量のデータセットを処理する)。基本的に、SNP の次のビット表現があり、いくつかの mask/and/xor/etc を書きたいと考えています。ある表現から次の表現にすばやく変換できるようにします。

00 -> 100

01 -> 010

11 -> 001

したがって、たとえば 00010111 は 100010010001 に変換する必要があります。ビットをかなり大きな java.util.BitSet に格納していますが、理想的には、ビット演算子を使用して新しい形式に変換できるようにしたいと考えています。

どんな助けでも大歓迎です!

4

1 に答える 1

1

ルックアップテーブルを使用します。一度に 16 ビットを取得し、24 ビット エントリを持つ 64K テーブルで検索します。

int[] table = new int[65536];
table[0] = 0b100100100100100100100100;
table[1] = 0b100100100100100100100010;
...
table[65535] = 0b001001001001001001001001;
BitSet output = new BitSet();
for (int i = 0; i < length; i += 16) {
    int x = (input.get(i) ? 1 : 0)
          + (input.get(i+1) ? 2 : 0)
          ...
          + (input.get(i+15) ? 32768 : 0);
    int y = table[x];
    output.set(i/16*24, (y & 1) != 0);
    output.set(i/16*24 + 1, ((y>>1) & 1) != 0);
    ...
    output.set(i/16*24 + 23, ((y>>23) & 1) != 0);
}
于 2012-08-03T20:54:42.087 に答える