在c#中使用Bitmask读取ushort的前2位



我有一个ushort数组,想要遍历该数组并检查该ushort的前两位是否为11,如果是的话,我想要清除它们。但是,我用来读取条件中的前两位的位掩码不能正常工作,并且当前两位为11

时,if语句不会触发。
static public void trimData(ushort[] rawData)
{
for(int i = 0; i < rawData.Length; i++)
{
if (((ushort)(rawData[i] & (1 << 15)) == 1) && ((ushort)(rawData[i] & (1 << 14)) == 1))
{
rawData[i] = (ushort)(rawData[i]&~(1<<15));
rawData[i] = (ushort)(rawData[i]&~(1<<14));
}
}
}

我如何使用位掩码来正确地做到这一点?

你可以把这些位移到最右边,然后用0b11:

遮罩
// drop all bits except topmost ones 16 - 14 == 2 which are now the rightmost
int bits = (rawData[i] >> 14) & 0b11; 
if (bits == 0b11) {
// Both bits are set
}

要清除这些位,您可以使用异或^(自1 ^ 1 == 0):

int mask = 0b11 << 14;
// remove 14th and 15th set bits  
rawData[i] = (ushort)(rawData[i] ^ mask);

让我们把这些部分组合起来:

if (((rawData[i] >> 14) & 0b11) == 0b11)
rawData[i] = (ushort)(rawData[i] ^ (0b11 << 14));
最后,方法可以是
public static void trimData(ushort[] rawData) {
if (rawData is null)
throw new ArgumentNullException(nameof(rawData));
for (int i = 0; i < rawData.Length; i++) 
if (((rawData[i] >> 14) & 0b11) == 0b11)
rawData[i] = (ushort)(rawData[i] ^ (0b11 << 14));
}

你能试试吗?

static public void trimData(ushort[] rawData)
{
for(int i = 0; i < rawData.Length; i++)
{
if (49152 == (49152 & rawData[i]))
{
rawData = rawData.Where(x=>x != rawData[i]).ToArray();
}
}
}

49152 = (2^14) + (2^15)

最新更新