2半字节结构,指定运算符和位集。如何?

时间:2014-02-12 19:21:42

标签: c++ struct operators bit-fields

我有一个旧设备通过串行端口发送大量7位字节(最高有效位始终为0)。这些字节以两个半字节分开发送,因此接收字节0abcdefg00000abc 0000defg。 所以我创建了一个DoubleByte结构来存储它们中的每一个:

struct Dbyte {
    BYTE h;
    BYTE l;
};

现在,我有两个问题:

1)我想要做的是将每个Dbyte作为普通的基本类型变量访问,所以我试图覆盖一些运算符:

struct Dbyte {
    BYTE h;
    BYTE l;
    Dbyte& operator =(const Dbyte& a) {
        l = a.l; h = a.h;
        return *this;
    }
    Dbyte& operator =(const int& i) {
        l = i&0x0F; h = i>>4 & 0x07;
        return *this;
    }
    int operator = (const Dbyte& a) const {
        return (int)(a.h<<4 + a.l);
    }
};

用我的代码可以做到:

Dbyte db1, db2;
db1 = 20;
db2 = db1;

但我无法编译

int i = db1;

我做错了什么?

2) 这些Dbytes中的一些是位域(或低半字节是值,高半字节是位域)。 有一种方便的方式来访问它们吗?我刚刚学会了std :: bitset的存在,但我仍然不知道如何使用它们,在我的梦中我想写一些像

if (db1[6]==true) ...

if (db1.bit[6]==true) ...

有办法获得这样的东西吗?

如果这很重要,我正在使用C ++ Builder 2006,但该项目可以在QTQuick应用程序中迁移,所以我更喜欢“stardard c ++”解决方案。

由于

3 个答案:

答案 0 :(得分:1)

要将您的类型转换为其他类型,您需要转换,而不是分配,运算符:

operator int() const {
    return (h<<4) + l;
}

对于相反的转换,使用转换构造函数而不是赋值运算符会更好:

DByte(int i) : l(i & 0xf), h((i>>4) & 0xf) {}

这可以用于初始化DByte以及分配给它:

DByte db = 42;  // not assignment - requires a constructor

赋值仍然只适用于此构造函数,并且没有特殊赋值运算符 - 可以使用构造函数转换整数值,然后使用隐式赋值运算符进行赋值。

最后,在这里编写自己的复制构造函数毫无意义。隐含的做法完全相同。

答案 1 :(得分:0)

int operator = (const Dbyte& a) const尝试成为一个复制赋值运算符,但不能因为它是const。你想写的是:operator int() const

答案 2 :(得分:0)

我认为你的overloaded = operator for int超出了范围,因为你把它放在了DByte的结构中。对于您的Dbyte [i] == true概念,请尝试重载[]运算符以返回布尔值。