我得到以下代码:
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。
我建议使用一个函数来预先计算一个辅助位集:
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;
创建一个采用 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,它可以让您创建函数表达式。
如果你绝望了,你可以定义一个带有静态函数的内部类或结构体:C++ 我们可以在函数内部拥有函数吗?