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

Java 使用位操作运算符进行位格式转换,java,bit-manipulation,Java,Bit Manipulation,我有一点转换的问题,我有点挣扎。一点背景知识。。。处理一些计算生物学问题,因此需要超快速(处理海量数据集)。基本上,我有以下SNP的位表示,我想写一些掩码/和/异或/等操作,以便我可以快速地从一个表示转换到下一个表示: 00->100 01->010 11->001 因此,例如00010111应该转换为100010010001。我将这些位存储在一个相当大的java.util.BitSet中,我希望能够使用位运算符将它们转换为新格式 欢迎任何帮助 我会使用查找表。一次获取16位,然后在包含24位条

我有一点转换的问题,我有点挣扎。一点背景知识。。。处理一些计算生物学问题,因此需要超快速(处理海量数据集)。基本上,我有以下SNP的位表示,我想写一些掩码/和/异或/等操作,以便我可以快速地从一个表示转换到下一个表示:

00->100

01->010

11->001

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


欢迎任何帮助

我会使用查找表。一次获取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);
}
int[]table=newint[65536];
表[0]=0B100100;
表[1]=0B100100010;
...
表[65535]=0B001001;
位集输出=新位集();
对于(int i=0;i>1)&1)!=0);
...
输出设置(i/16*24+23,((y>>23)和1)!=0);
}

您需要详细描述转换的工作原理。模式匹配?流动?我们需要更多信息。你试过什么?这些字是否大于64位?如果是这样的话,我不确定您是否会对基于操作的解决方案感到满意。你试过了吗?好的,现在我正在手动操作,比如每两个比特加上3个比特,再加上一个单独的比特集。然而,这个过程相当缓慢。我一直在尝试修改该过程,以允许我立即对entier位集执行某些按位操作,从而生成新格式。您是否运行了探查器?我建议您在重新设计任何东西之前尝试一下,只是为了确保没有任何有趣的事情会影响性能。我最喜欢的免费软件是jvisualvm。另一个想法是使用查找表进行位转换。如果速度仍然很慢,甚至可以扩展查找表,将每个4位扩展为6位,以此类推。