可能的c++ 2位位域数组

C++ 2-bit bitfield arrays possible?

本文关键字:位域 数组 2位 c++      更新时间:2023-10-16

我有一个像这样的2位位域结构体:

struct MyStruct {
    unsigned __int32 info0  : 2;
    unsigned __int32 info1  : 2;
    unsigned __int32 info2  : 2;
   ...
    unsigned __int32 info59 : 2;
};

像这样的另一个可以达到120…有没有一种方法来写和地址他们作为一个数组?

如果你因为任何原因不能使用Paul R的答案,你总是可以使用标准数组的自定义访问器:

static unsigned __int8 infos[30]; // 240 bits allocated
unsigned __int8 getInfo( unsigned short id_num )
{
    return (infos[id_num/4] >> ((2*id_num) % 8) ) & 0x3;
}
// setInfo left as an exercise.

(您可能需要检查这里的逻辑,我还没有测试它。)

我将使用代理对象来创建一个临时引用,该引用可用于使用数组语法操作2位项。这可以很容易地修改为处理n位项。

#include <iostream>
class TwoBitArray {
public:
    typedef unsigned char byte;
    TwoBitArray(unsigned size) : bits(new byte[(size + 3) / 4]) {}
    ~TwoBitArray() { delete bits; }
    class tbproxy {
    public:
        tbproxy(byte& b, int pos) : b(b), pos(pos) {}
        // getter
        operator int() const {
            return (b >> (pos * 2)) & 3;
        }
        // setter
        tbproxy operator=(int value) {
            const byte mask = ~(3 << (pos * 2));
            b = (b & mask) | (value << (pos * 2));
            return *this;
        }
    private:
        byte& b;
        int pos;
    };
    // create proxy to manipulate object at index
    tbproxy operator[](int index) const {
        return tbproxy(bits[index/4], index & 3);
    }
private:
    byte* bits;
};
int main() {
    const int size = 20;
    TwoBitArray a(size);
    for (int i = 0; i < size; ++i)
        a[i] = i & 3;
    for (int i = 0; i < size; ++i)
        std::cout << i << ": " << a[i] << std::endl;
}