【问题标题】:C# Bitmasking not returning expected outcomeC#位掩码不返回预期结果
【发布时间】:2014-07-28 20:12:37
【问题描述】:

我有一个应用程序需要我进行一些位屏蔽。掩码将检查一个字符串,并根据该字符串中的哪些位是高(1)或低(0)输入不同的方法。

如果它们是低 (0) 位是无能为力的,我们假设如果它们是高 (1) 则一切正常。

254 = 11111110 二进制。这是我想用来检查最后一位的掩码,

void Main()
{
    ushort[] data = new ushort[]{254};

    int alertPosition = 251;
    int tempCriticalPosition = 247;
    int fan1FailurePosition = 253;
    ** int fan2FailurePosition = 254;

    int alarmCritialBit = (tempCriticalPosition & data[0]) == 0 ? 0 : 1;
    int fan1LedFlag = (fan1FailurePosition & data[0]) == 0 ? 0 : 1;
    **int fan2CameraFlag = (fan2FailurePosition & data[0]) == 0 ? 0 : 1;
    int alertFlag = (alertPosition & data[0]) == 0 ? 0 : 1;

    System.Console.WriteLine(alarmCritialBit);
    System.Console.WriteLine(fan1LedFlag);
    System.Console.WriteLine(fan2CameraFlag);
    System.Console.WriteLine(alertFlag);
} 

在本例中,这是一个 fan2Failure。 所以我的数组中的数据和我的位掩码是相同的,但我得到的结果是 1。我做其他检查得到的结果也是 1,所以我现在对它是如何工作的感到困惑。

我在网上查找的所有内容都推荐了类似的方法,我认为要检查我的数据是否存在 fan2failure,我在掩码中提供了 fan2failure 的字符串,如果数据和我的掩码相同,它将返回 0 ?

我知道这很简单,但我上网查了一下,看不出我做错了什么。

谢谢

【问题讨论】:

  • 为什么fan2CameraFlag 不应该是 1? 254 & 254 == 254,因此你从它的表达式中得到 1。这是错的吗?
  • Using a bitmask in C#的可能重复
  • 为了所有有洞的事物的爱。请使用枚举!为了理智。为了类型安全!为了可读性。拜托拜托。

标签: c# binary bitmask


【解决方案1】:

为什么使用inverted 位掩码?

检查位时我通常会先定义如下常量:

const uint fMyFlag = 1u<<0;
const uint fSecond = 1u<<1;

const uint mMyMask = 3u<<2;
const uint mOpt1   = 0u<<2;
const uint mOpt2   = 1u<<2;
const uint mOpt3   = 2u<<2;
const uint mRsvd   = 3u<<2;

并执行以下操作:

if((value&fMyFlag) != 0) flag_is_set();
if((value&fMyFlag) == 0) flag_is_not_set();
if((value&mMyMask) == mOpt1) option_one();

value |= fMyFlag; // set the flag
value &=~fMyFlag; // clear the flag
value = (value&~mMyMask) | mOpt2; // set option 2

注意:上述操作也适用于枚举;)

【讨论】:

    【解决方案2】:

    要检查你必须做的面具:

    (value & mask) == mask
    

    所以:

    **int fan2CameraFlag = (fan2FailurePosition & data[0]) == fan2FailurePosition ? 0 : 1;
    

    【讨论】:

      【解决方案3】:

      在我看来,您使用了错误的掩码值。

      例如:

      ushort[] data = new ushort[] { 254 };  // 11111110
      int fan1FailurePosition = 253; //11111101
      

      您希望这返回 false,但实际上您正在执行 AND,所以:

      11111110
      11111101  (AND)
      --------
      11111100  (WHICH IS TRUE)
      

      要获得正确的值,您可以简单地设置:

      int fan1FailurePosition = 1; //0000001
      

      导致:

      11111110
      00000001  (AND)
      --------
      00000000  (WHICH IS FALSE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多