C++ 2-bit bitfield arrays possible?

前端 未结 2 1077
走了就别回头了
走了就别回头了 2020-12-21 09:11

I have a struct of 2-bit bitfields like this:

struct MyStruct {
    unsigned __int32 info0  : 2;
    unsigned __int32 info1  : 2;
    unsigned __int32 info2          


        
相关标签:
2条回答
  • 2020-12-21 09:17

    If you can't use Paul R's answer for whatever reason, you can always use a custom accessor with a standard array :

    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.
    

    (You may need to check the logic here, I haven't tested it.)

    0 讨论(0)
  • 2020-12-21 09:36

    I would use a proxy object to create a temporary reference which could be used to manipulate 2-bit items using array syntax. This could easily be modified to handle n-bit items.

    #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;
    }
    
    0 讨论(0)
提交回复
热议问题