作为串行数据协议解码器的一部分,我必须解码插入了同步位的数据(不属于数据的位,并且始终为#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;
}