【发布时间】:2012-07-17 08:47:18
【问题描述】:
我有一个位域结构,我想使用掩码对其执行按位运算。 我想知道最简单、最有效的方法。 我尝试使用我的转换运算符(这似乎是对两个结构执行 & 操作的一种低效方式),但我收到错误 C2440: 'type cast' : cannot convert from 'const test::dtType' to 'char'。没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
class test
{
public:
test() : startTime(0), endTime(5,23) {}
~test();
struct dtType {
// inline constructors with initialisation lists
dtType() {dtType(0);}
dtType(byte z) {dtType(z,z);}
dtType(byte n,byte h) : mins(n), hrs(h){}
// inline overloaded operator functions
operator char() {return mins + hrs<<3;}; // allow casting the struct as a char
// All I want to do is return (this & hrsMask == date & hrsMask)
// I know that in this trivial case I can do return (hrs == date.hrs) but I have simplified it for this example.
bool operator== (dtType date){return (char(this) & char(hrsMask)) == (char(date) & char(hrsMask));};
// data members
unsigned mins: 3; // 10's of mins
unsigned hrs: 5; // 8 bits
};
const static dtType hrsMask; // initialised outside the declaraion, since a static is not associated with an individual object.
dtType startTime; // initialised by test() in its initialisation list
dtType endTime; // initialised by test() in its initialisation list
};
// Typically in a source file, but can be in the header.
const test::dtType hrsMask(0,31);
我尝试过使用 void 指针进行按位运算。它可以编译,但我还没有测试过。
bool test::dtType::operator== (dtType date){
const void * longThisDT = this;
const void * longThatDT = & date;
const void * longMaskDT = & hrsMask;
return (*((long *)longThisDT) & *((long *)longMaskDT) == *((long *)longThatDT) & *((long *)longMaskDT));
};
这是否尽可能高效?它涉及三个额外的指针,而我真正需要的只是转换为 long。
【问题讨论】:
-
我通常使用联合和/或位域来处理这类东西。
-
我从一个联合开始,但你不能拥有一个包含具有非平凡构造函数的结构的联合。
-
而包含位域的联合并没有多大意义。
-
@James:为什么不用位域的联合呢?我使用位域进行操作,并使用联合中的 long 将位域存储到 EEPROM。
-
@StephenD 如果它完全是本地的,它会工作,但为什么不将结构与位域本身一起存储。与位域联合的通常使用是匹配一些外部布局,然而,这不起作用,因为位域的布局没有指定,并且可以在不同的实现之间变化。
标签: c++ struct bit-manipulation conversion-operator