使用bitmask读取C#中的ushort的前2位

发布于 2025-02-07 23:42:36 字数 552 浏览 2 评论 0原文

我有各种各样的吸管,想迭代数组,并检查该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));
     }
   }

}

我该如何使用bitmasks正确执行此操作。 ?

I have an array of ushorts and want to iterate over the array and check if the first two bits of that ushort are 11 if so I want to clear them. However the bit mask I am using to read the first two bits in my conditional are not working properly and the if statement does not trigger when the first two bits are 11

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));
     }
   }

}

How can I use bitmasks to do this correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

匿名。 2025-02-14 23:42:37

您可以将这些位移动以使它们成为最右边的位,然后用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));
}

You can shift these bits to have them being the rightmost ones and then mask with 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
 }

To clear these bits you use XOR ^ (since 1 ^ 1 == 0):

 int mask = 0b11 << 14;

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

Let's combine these parts:

 if (((rawData[i] >> 14) & 0b11) == 0b11)
   rawData[i] = (ushort)(rawData[i] ^ (0b11 << 14));

Finally, the method can be

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));
}
折戟 2025-02-14 23:42:37

你能尝试一下吗?

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)

Can you try this?

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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文