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

时间:2017-04-06 20:04:03

标签: java bit-manipulation

作为串行数据协议解码器的一部分,我必须解码插入了同步位的数据(不属于数据的位,并且始终为#1;')。我需要移除同步位并通过移动剩余的位来组装数据。每个32位字具有不同的同步位模式。我知道模式是什么,但我不能想出删除同步位的概括。

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

  

0 1 1 1 1 0 0 1 1 0 1 1

我知道其中一些比特是同步比特,特别是那些是' 1'在这个面具中:

  

0 0 1 1 0 0 0 0 1 0 0 1

结果数据应该是带有' 0'的数据位。在相应的掩码中,移位以移除同步位,用零填充右边。上面的掩码可以理解为"取前2位,跳过下2位,取下4位,跳过下位,取2位,跳过1位"。

E.g我最终应该:

  

0 1 1 0 0 1 0 1 0 0 0 0

尝试在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;
}

0 个答案:

没有答案