Bit manipulation 具有可选项的位字段掩码/操作
我试图找到一种方法来处理几个位字段情况,包括可选、必需和不允许的位置Bit manipulation 具有可选项的位字段掩码/操作,bit-manipulation,bit-fields,bitmask,Bit Manipulation,Bit Fields,Bitmask,我试图找到一种方法来处理几个位字段情况,包括可选、必需和不允许的位置 yy?nnn?y 11000001 ?yyy?nnn 01110000 nn?yyy?n 00011100 ?nnn?yyy 00000111 在这四种情况下,?表示位可以是1或0,而y表示需要1,而n表示需要0。所需位的左/右位可以是任何内容,其余位必须是0。是否有一种掩蔽方法可用于测试输入位集是否满足以下情况之一?尝试类似的方法(使用C/C++表示法): (输入和掩码)=掩码&&(输入&~(掩码| mask1))=
yy?nnn?y
11000001
?yyy?nnn
01110000
nn?yyy?n
00011100
?nnn?yyy
00000111
在这四种情况下,?
表示位可以是1
或0
,而y
表示需要1
,而n
表示需要0
。所需位的左/右位可以是任何内容,其余位必须是0
。是否有一种掩蔽方法可用于测试输入位集是否满足以下情况之一?尝试类似的方法(使用C/C++表示法):
(输入和掩码)=掩码&&(输入&~(掩码| mask1))==0
当然,这取决于您如何表示“模板”
例如,假设您将它们表示为一对(z,o)
,其中z
对于允许为0的每一位都有一个1,而o
对于允许为1的每一位都有一个1(如我在评论中链接的文章中所述)。然后针对它测试x
,您可以执行以下操作:
if ((x | z) == -1 && (x & o) == x)
passes test
您还可以将模板表示为一对(掩码,位)
,其中掩码
是必须匹配的所有位的掩码(即0表示?,1表示固定位),位
是固定位的值。然后您可以测试x
如下:
if ((x & mask) == bits)
passes test
一般来说。如果您的问题有特殊的形式,就像您的问题一样,您可以使用专门的测试。这让我想起了“检查我的解决方案”中描述的按位域,它可以直接使用您的掩码:
if ((x & mask) == bits)
passes test