检查 bitset 中的多个位

Check multiple bits in bitset

我得到了以下代码:

p = B[m] & B[m + 5] & B[m + 6] & B[m + 11];

m -= d * (l > 0) * 11 + !d * (c % 5 > 0);

p += m ^ M ? B[m] & B[m + 5] & B[m + 6] & B[m + 11] : 0;

我知道这很难读,但这里有一个 TL;DR :我检查一个位集中的多个位(所有都与 m 相关),然后我更改变量 m 的值并再次检查(其他位)。有没有一种方法可以用更少的代码访问这些位,或者将检查模板化(因为位的公式相同)?

B[m] & B[m + 5] & B[m + 6] & B[m + 11]

谢谢 :D.

创建一个接受 B 和 m 的函数。

所以 p = yourFunc(B, m)p += m ^M ? yourFunc(B, m) : 0

函数类似于:

TYPEOFP yourFunc(TYPEOFB b, TYPEOFM m) {
    return b[m] & b[m + 5] & b[m + 6] & b[m + 11];
}

我不知道你的类型,所以你需要填写。

我不推荐宏,但如果你想要它,它是

#define yourMACRO(b, m) ((b)[(m)] & (b)[(m) + 5] & (b)[(m) + 6] & (b)[(m) + 11])

如果你传入 b 或 m 的表达式,所有这些额外的括号都是为了保护你。如果你传入一些有副作用的东西(比如 ++m),宏将会失败。

编辑:根据你的评论,你说你不能在函数外写。

它是非正统的,但你可以在函数中执行 #define 并在函数末尾执行 #undef

根据您的 C++ 版本,您可能有 lambda,它可以让您创建函数表达式。

如果你走投无路,你可以定义一个内部class或者带有静态函数的结构:C++ can we have functions inside functions?

我建议使用函数为此预先计算一个辅助位集:

bitset<99> prepare_bitset(const bitset<99>& B)
{
   return B & (B<<5) & (B<<6) & (B<<11);
}

那你就可以这样使用了:

auto HB = prepare_bitset(B);
p = HB[m];
m -= d * (l > 0) * 11 + !d * (c % 5 > 0);
p += m ^ M ? HB[m] : 0;

UPD:另一种选择是直接定义 HB

auto HB = B & (B<<5) & (B<<6) & (B<<11);
p = HB[m];
m -= d * (l > 0) * 11 + !d * (c % 5 > 0);
p += m ^ M ? HB[m] : 0;