簡體   English   中英

在 C# 中使用位掩碼讀取 ushort 的前 2 位

[英]Using Bitmask to read first 2 bits of a ushort in C#

我有一個 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
 }

要清除這些位,請使用 XOR ^ (因為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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM