检查位集中的多个位

问题描述 投票:0回答:2

我得到以下代码:

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。

c++ bit
2个回答
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;

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 的表达式,所有这些额外的括号都会保护您。如果您传递带有副作用的内容(例如 ++m),宏将会失败。

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

这是非正统的,但你可以在函数中执行

#define
并在函数末尾执行
#undef

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

如果你绝望了,你可以定义一个带有静态函数的内部类或结构体:C++ 我们可以在函数内部拥有函数吗?

© www.soinside.com 2019 - 2024. All rights reserved.