【问题标题】:Bitfield mask/operations with optional items带有可选项目的位域掩码/操作
【发布时间】:2014-08-22 21:09:26
【问题描述】:

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

yy?nnn?y
11000001

?yyy?nnn
01110000

nn?yyy?n
00011100

?nnn?yyy
00000111

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

【问题讨论】:

标签: bit-manipulation bit-fields bitmask


【解决方案1】:

当然,但这当然取决于您如何表示“模板”。

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 2014-07-05
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多