C++ 检查位集中的多个位

C++ 检查位集中的多个位,c++,bits,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 for it:我检查一个位集中的多个位(都与m有关),然后更改变量m的值,然后再次检查(

我得到了以下代码:

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


谢谢你: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,让你可以创建函数表达式。


如果您不顾一切,可以使用静态函数定义内部类或结构:

生成一个接受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,让你可以创建函数表达式。


如果您不顾一切,可以使用静态函数定义一个内部类或结构:

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

bitset<99> prepare_bitset(const bitset<99>& B)
{
   return B & (B<<5) & (B<<6) & (B<<11);
}
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;

auto HB=B&(B我建议使用一个函数来预计算辅助位集:

bitset<99> prepare_bitset(const bitset<99>& B)
{
   return B & (B<<5) & (B<<6) & (B<<11);
}
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;


auto HB=B&(B如果您声明变量static int P,m,P,m;静态位集B,将更容易阅读;有趣的是,您的位集适合一个SSE寄存器,这将允许预计算
B[m]&B[m+5]&…
对于所有
m
值都非常快,同时我知道你在说什么,但我不想更改结构(位集)你能帮我链接一下吗?@aleeN1我认为你不需要修改任何东西,很可能编译器会利用它。请注意,
bitset
非常轻量级,所以复制它完全可以。如果你声明variablesstatic int P,m,会更容易阅读,p,M;静态位集B;有趣的是,您的位集可以放入一个SSE寄存器,这将允许对所有
M
值预计算
B[M]&B[M+5]&…
速度极快,同时询问您在说什么,但我不想更改结构(位集)你能帮我链接一下吗?@aleeN1我想你不需要修改任何东西,很可能编译器会利用它。请注意,
bitset
非常轻量级,所以可以在代码周围复制它,因为它来自函数。我不能在函数之外写任何东西我忘记了指定这个。抱歉。什么版本的C++?最近的一个。14我想它是用lambda:我想了,但是我不能弄清楚怎么做它,因为它是一个复杂的代码…代码来自函数。我不能写任何功能之外。我忘记指定。抱歉。什么版本的C++?最新的一个。14我想ISU。se a lambda:我考虑过了,但我不知道怎么做,因为这是一个复杂的函数。我能在函数内部做吗?我说的是prepare_bitset函数,我能在另一个函数中写吗?我会试试。我想lambda只能用作函数的参数。我能在函数内部做吗?我说的是about prepare_bitset函数,我可以在另一个函数中写入吗?我会尝试一下。我认为lambdas只能用作函数的参数。