Java 删除表示为掩码的特定位的逐位操作

Java 删除表示为掩码的特定位的逐位操作,java,bit-manipulation,Java,Bit Manipulation,作为串行数据协议解码器的一部分,我必须解码插入了同步位的数据(不属于数据的一部分且始终为“1”)。我需要删除同步位,并通过将剩余位向左移位来组装数据。每个32位字具有不同的同步位模式。我知道这些模式是什么,但我不能提出一个删除同步位的通用方法 例如,我可能有这样的位模式(例如,仅显示12位): 011010011 我知道其中一些位是同步位,特别是在该掩码中为“1”的位: 0 0 1 0 0 0 1 0 1 生成的数据应该是那些在相应掩码中带有“0”的数据位,移位以删除同步位,并用零向右填充。上面

作为串行数据协议解码器的一部分,我必须解码插入了同步位的数据(不属于数据的一部分且始终为“1”)。我需要删除同步位,并通过将剩余位向左移位来组装数据。每个32位字具有不同的同步位模式。我知道这些模式是什么,但我不能提出一个删除同步位的通用方法

例如,我可能有这样的位模式(例如,仅显示12位):

011010011

我知道其中一些位是同步位,特别是在该掩码中为“1”的位:

0 0 1 0 0 0 1 0 1

生成的数据应该是那些在相应掩码中带有“0”的数据位,移位以删除同步位,并用零向右填充。上面的掩码可以理解为“取前2位,跳过下2位,取下4位,跳过下一位,取2位,跳过1位”

例如,我应该以以下方式结束:

01101000

尝试在Java中实现这一点,但我没有看到任何位掩码/移位操作可以实现这一点


我能想到的最佳方法(不会让结果左对齐,但这对我来说是可以的):

private static final int MSB_ONLY=0x8000000;
专用静态整数压缩位(整数数据、整数掩码){
int v=0;
对于(int i=0;i>31);
}
否则{
//扔掉一点
}

mask=mask单靠按位操作是无法做到这一点的。基本上,您需要一个循环来逐位构造输出(尽管您可能能够利用查找表或类似的方法来改进)。使用我能想到的最好的(循环方法)更新了此内容…您可以基于
pext
,Java不公开它,但它,虽然模拟有点糟糕——可能并不比仅仅用明显的方式来做要好,但是单用位操作是无法做到这一点的。基本上,您需要一个循环来逐位构造输出(尽管您可能能够利用查找表或类似的方法来改进)。使用我能想到的最好的(循环方法)更新了此内容…您可以基于
pext
,Java不公开它,但它,尽管这种模拟有点糟糕——可能并不比用显而易见的方式做得更好
private static final int MSB_ONLY = 0x80000000;

private static int squeezeBits(int data, int mask) {
    int v = 0;
    for (int i=0; i<32; i++) {
        if ((mask & MSB_ONLY) != MSB_ONLY) {
            // There is a 0 in the mask, so we want this data bit
            v = (v << 1) | ((data & MSB_ONLY) >>> 31);
        }
        else {
            // Throw bit away
        }
        mask = mask << 1;
        data = data << 1;
    }

    return v;
}