c#位掩码没有返回预期的结果
本文关键字:结果 返回 掩码 | 更新日期: 2023-09-27 18:15:25
我有一个应用程序,需要我做一些位屏蔽。屏蔽将检查字符串,并根据该字符串中哪些位是高(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?
我知道这很简单,但是我在网上看了看,看不出我做错了什么。
谢谢
为什么使用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
:以上操作也适用于枚举;)
检查掩码的操作如下:
(value & mask) == mask
:
**int fan2CameraFlag = (fan2FailurePosition & data[0]) == fan2FailurePosition ? 0 : 1;
在我看来,你使用了错误的掩码值。
例如: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)