检查 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;
我得到了以下代码:
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;