我正试图找到一种方法来处理几个位域的情况,包括可选的,必需的,和不允许的位置。
yy?nnn?y
11000001
?yyy?nnn
01110000
nn?yyy?n
00011100
?nnn?yyy
00000111
在这四种情况中,?
表示可以是1
或0
, 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