使用位操作运算符进行位格式转换

时间:2012-08-03 20:25:38

标签: java bit-manipulation

我有点转换问题,我有点挣扎。一些背景......研究一些计算生物学问题,因此需要快速进行超级处理(处理海量数据集)。基本上我有以下SNP的位表示,我想写一些mask /和/ xor / etc。操作,以便我可以快速从一个表示转换为下一个表示:

00 - > 100

01 - > 010

11 - > 001

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

非常欢迎任何帮助!

2 个答案:

答案 0 :(得分:1)

我只使用16位到24位的查找表。

答案 1 :(得分: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);
}