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