太多标志(咬合) - 超过80(!!)错误结果

时间:2014-04-11 07:48:38

标签: c# bit-manipulation flags

我有一个外围硬件子系统。每个外设都可以返回少量错误 子系统指示一个标志中的每个错误,所以当我调用一个方法检查所有外设状态时,它返回一个Uint64代码,它是所有错误代码的总和

示例

error1 = 1;
error2 = 2;
error3 = 4;
......
error7 = 64;
error8 = 128;
error9 = 256;
.......

所以,如果我得到196的返回码,则表示我得到error3,error8和错误7(4 + 64 + 128)

总错误数可以达到50多个错误,这就是返回代码为Uint64的原因

哪个error64可以是一个非常大的数字(18446744073709551616),并且在将来的参考中可能有80多个错误

当有超过50个标志要检查时,有没有办法实现标志系统?

2 个答案:

答案 0 :(得分:1)

我将尝试使用Uint64 Enum提供一种存储超过64个错误的机制。

public enum MyFlag : UInt64
{
   control = 1,
   error1 = 2,
   error2 = 4,
   error3 = 8,
   //.......
   error63 = 9223372036854775808
}

这是枚举。注意我们保留控制位的最低有效位。

这意味着我们现在可以拥有63 * 2 = 126个不同的代码。

缺点是代替通常的检查,例如:

resultFlag & MyFlag.error3

我们需要进行复合检查,例如:

resultFlag & MyFlag.error3 && resultFlag & MyFlag.control

或:

resultFlag & MyFlag.error3 && resultFlag%2

我希望这会有所帮助。欢呼声。

答案 1 :(得分:0)

你可以创建枚举:

[Flags] enum Errors {error1 =1,error2=2,error3=4, error4=8}

然后当你从子系统得到答案时就这样做。

var MyNewError = 11;
Errors DecodedErrors = (Errors)MyNewError;

然后通过将DecodedErrors转换为字符串来获取所有错误的快速列表。

 Console.WriteLine(DecodedErrors.ToString());
 //output: error1, error2, error4

将它与@nestedloop解决方案相结合,你就在家里。