我正在使用一个接口,其中大多数标志在未设置时隐式为false,但某些参数具有明确的' x-not-set'标志,以便任何一个标志可以传入,但从不两者都传入,在某些情况下,都不应该传入。我认为基本逻辑是' x-not-set'不等同于排除&x; x-set'在x
不应默认启用的情况下。
带有标记X, Z
的参数X, Z, no-Z
的参数标志排列示例:
<empty>
/X
/Z
/no-Z
/X /Z
/X /no-Z
因此,如果我将Z
和no-Z
视为掩码中的一位,则会生成一个空位掩码,并且只设置no-Z
00
,但如果我处理它们作为单独的位,然后两者都可以设置为:
/Z /no-Z
/X /Z /no-Z
不仅可能有不可预测或致命的反应,而且在我的真实场景中可能有5个简单(如/ X)参数和3个XOR(如/ Z,/ no-Z或空),测试所有排列与所有有效排列(2 ^ 11 vs(2 ^ 8)+8)的成本相当高。
有没有一种方法我没有考虑设置这些位,以便其中一些是打开还是关闭,而其他位置(缺少更好的术语),开,关或空?
编写完所有内容之后,我想到的最简单的解决方案是定义设置了那些非法组合的常量,然后对这些设置进行XOR选项掩码,这样如果两者都设置,则两者都取消设置。但我仍然不确定如何以优雅的方式做到这一点,即某种方式标记&#39;哪些比特是XOR比特(如果这有意义的话。我只是在这个逻辑层面碰到了我的墙。)
答案 0 :(得分:0)
您可以使用两位对Z
的三种可能配置进行编码:
Z1 Z0
-------
0 0 Z undefined (value for Z0 irrelevant)
1 0 Z = No
1 1 Z = Yes
要定义Z
的值,必须通过Z1
设置位OR
。也可以通过Z0
设置位OR
,或通过AND
和反转掩码清除位。{/ p>
C
语法中的示例:
#define DEF_Z 2
#define SET_Z 1
flags = (flags | DEF_Z) | SET_Z; // /Z
flags = (flags | DEF_Z) & ~ SET_Z // /no-Z