如何将异或OR布尔存储为位掩码

时间:2014-11-21 01:55:10

标签: xor bitmask

我正在使用一个接口,其中大多数标志在未设置时隐式为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

因此,如果我将Zno-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比特(如果这有意义的话。我只是在这个逻辑层面碰到了我的墙。)

1 个答案:

答案 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