2012-08-03 58 views
0

我有点转换问题,我有点挣扎。有点背景......处理一些计算生物学问题,因此需要快速地处理(处理大量数据集)。基本上我有以下SNP的位表示,我想写一些掩码/和/ XOR /等。操作这样我就可以迅速转换从一个表示到下一个:使用位操作操作符的位格式转换

00 - > 100

01 - > 010

11 - > 001

因此,例如,00010111应转换为100010010001 。我将这些位存储在一个相当大的java.util.BitSet中,并希望能够使用位运算符将它们转换为新格式。

任何帮助将非常欢迎!

+0

您需要详细介绍转换的工作原理。模式匹配?流?我们需要更多信息。 – 2012-08-03 20:28:07

+0

你有什么尝试?这些单词是否大于64位?如果是这样,我不确定你会对基于位操作的解决方案感到满意。你有没有试过[绳索](http://en.wikipedia.org/wiki/Rope_%28computer_science%29)? – 2012-08-03 20:31:43

+0

那么现在我正在手动执行,就像在每两个位一样,并将三个位添加两个单独的BitSet。但是,这个过程相当缓慢。我一直在尝试修改该过程,以允许我一次对entier BitSet执行一些按位操作,这将生成新格式。 – 2012-08-03 20:32:27

回答

0

我会使用查找表。每次抓取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); 
} 
1

我只是使用一个16位到24位查找表。