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



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

yy?nnn?y
11000001
?yyy?nnn
01110000
nn?yyy?n
00011100
?nnn?yyy
00000111

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

当然,这取决于你如何表示"模板"。

例如,假设您将它们表示为一对(z, o),其中z对允许为0的每个位都有1,o对允许为1的每个位都有1(如我在评论中链接到的论文)。然后测试x与它,你可以这样做:

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

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

if ((x & mask) == bits)
    passes test

这是一般情况。如果您的问题有一个特殊的形式,就像您的问题一样,您可以使用专门的测试。

试试这样做(使用C/c++表示法):

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

最新更新