使用位操作的涉及位的模式的建议



我目前有一个类似的结构

struct foo
{
UINT64 optionA = 0;
UINT64 optionB = 0;
UINT64 optionC = 0;
}

我试图在optionAoptionBoptionC的基础上编写一个用于比较foo的两个对象的函数。从本质上讲,我希望函数检查optionA在两者中是否相同。如果否,则返回最低的对象。如果两个对象中的optionA相同,则它将检查两个对象的optionB,并返回最低的一个。如果optionB在两者中相同,则它将查看optionC并返回最低值。

我认为这可以通过为每个对象分配一个UINT64 no来实现。然后根据优先级将比特分配给no,然后比较每个比特并返回较小的一个。我不知道如何采取这种方法,任何这样做的建议都将不胜感激。

对于C++20,默认的operator <=>operator ==可以完成这项工作。

struct foo
{
UINT64 optionA = 0;
UINT64 optionB = 0;
UINT64 optionC = 0;
auto operator <=>(const foo&) const = default;
bool operator ==(const foo&) const = default;
};

否则,std::tuple可能会有所帮助:

bool operator ==(const foo& lhs, const foo& rhs)
{
return std::tie(lhs.optionA, lhs.optionB, lhs.optionC)
== std::tie(rhs.optionA, rhs.optionB, rhs.optionC);
}
bool operator <(const foo& lhs, const foo& rhs)
{
return std::tie(lhs.optionA, lhs.optionB, lhs.optionC)
< std::tie(rhs.optionA, rhs.optionB, rhs.optionC);
}

如果有一个直接按正确顺序比较数据成员的比较函数,会更简单、更可读,但如果有存储哪些数据成员更大的位掩码出于其他原因有帮助,那么我将如何做到这一点:

foo compare(foo x, foo y)
{
// needs to hold status for 3 data members (one bit each)
int x_status = 0, y_status = 0;
// each bit is 1 if this member is bigger, 0 if smaller
x_status |= (x.optionC > y.optionC)<<0;
x_status |= (x.optionB > y.optionB)<<1;
x_status |= (x.optionA > y.optionA)<<2;
// each bit is 1 if this member is bigger, 0 if smaller
y_status |= (x.optionC < y.optionC)<<0;
y_status |= (x.optionB < y.optionB)<<1;
y_status |= (x.optionA < y.optionA)<<2;
// so now we can compare the values
// if all the data members were bigger the value will be 7 (0b111)
// if all the data members were smaller the value will be 0 (0b000)
if (x_status < y_status) return x; else return y;
}

请在此处在线试用:https://onlinegdb.com/XpdOSFLFa

代码当前缺少一个检查相等性的运算符。

示例:

constexpr bool operator==(const foo& a, const foo& b) {
return
a.optionA == b.optionA &&
a.optionB == b.optionB &&
a.optionC == b.optionC;
}

有了它,下面的代码就会编译(有意义的(:

using UINT64 = /* unsigned long long */; // usually
struct foo {
UINT64 optionA = 0;
UINT64 optionB = 0;
UINT64 optionC = 0;
};
constexpr bool operator==(const foo& a, const foo& b) {
return
a.optionA == b.optionA &&
a.optionB == b.optionB &&
a.optionC == b.optionC;
}
int main() {
constexpr foo a, b;
static_assert(a == b);
}

相关内容

  • 没有找到相关文章

最新更新