我有一个外围硬件子系统。每个外设都可以返回少量错误 子系统指示一个标志中的每个错误,所以当我调用一个方法检查所有外设状态时,它返回一个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个标志要检查时,有没有办法实现标志系统?
答案 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解决方案相结合,你就在家里。