检查bitset

时间:2017-04-17 18:03:54

标签: c++ bits

我收到了以下代码:

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为它:我在一个bitset中检查多个位(都与m有关),然后我改变变量m的值和我再次检查(其他位)。有没有办法可以用更少的代码访问这些位,或模板检查(cuz是相同的位公式)?

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

谢谢你:D。

2 个答案:

答案 0 :(得分:3)

创建一个带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的表达式,所有这些额外的parens都会保护您。如果传入带有副作用的东西(如++ m),宏将失败。

编辑:从你的评论中,你说你不能在函数之外写。

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

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

如果你绝望,你可以使用静态函数定义内部类或结构:C++ can we have functions inside functions?

答案 1 :(得分:3)

我建议使用一个函数来预先计算一个帮助器位集:

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;