C#Bitmasking没有返回预期的结果

时间:2014-07-28 11:48:06

标签: c# binary bitmask

我有一个应用程序需要我做一些掩码。掩码将检查字符串,并根据该字符串中的哪些位为高(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 ?

我知道这很简单,但我已经在网上看了,不知道我做错了什么。

由于

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

要检查面具,你必须这样做:

(value & mask) == mask

所以:

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

答案 2 :(得分:0)

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

例如:

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)