具有可选项的位域掩码/操作

时间:2014-08-22 21:09:26

标签: bit-manipulation bit-fields bitmask

我正试图找到一种方法来处理包含可选,必需和不允许位置的几个位域案例。

yy?nnn?y
11000001

?yyy?nnn
01110000

nn?yyy?n
00011100

?nnn?yyy
00000111

在这四种情况下,?表示该位可以是10,而y表示需要1n 1}}表示需要0。所需位的左/右位可以是任何位,其余位必须是0。是否有一种掩蔽方法可用于测试输入位集是否满足其中一种情况?

2 个答案:

答案 0 :(得分:0)

尝试这样的事情(使用C / C ++表示法):

(input & mask) == mask && (input & ~(mask | mask<<1 | mask>>1)) == 0

答案 1 :(得分:0)

当然,这当然取决于你如何代表“模板”。

例如,假设您将它们表示为一对(z, o),其中z对于允许为0的每个位都有1,而o对于每个位都为1允许为1(如我在评论中链接的论文)。然后根据它来测试x

if ((x | z) == -1 && (x & o) == x)
    passes test

您还可以将模板表示为一对(mask, bits),其中mask是必须匹配的所有位的掩码(即0表示?,1表示固定位)和{{1是固定位的值。然后你可以测试bits,如:

x

总的来说。如果你的问题有一个特殊的形式,就像你的问题一样,你可以使用专门的测试。