我收到了以下代码:
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。
答案 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;