将位域导出到数组中

问题描述 投票:0回答:1

我已声明此位字段。我想做的是获取二进制位域的整个值并将其转换为数组,以便我可以使用索引并寻址每个“ 1”值。

union{
    struct shape{
        uint8_t p0 : 1;
        uint8_t p1 : 1;
        uint8_t p2 : 1;
        uint8_t p3 : 1;
        uint8_t p4 : 1;
        uint8_t p5 : 1;
        uint8_t p6 : 1;
        uint8_t p7 : 1;
    };
    uint8_t row;
}rows[8*2+4];

我想做的是导出位域,使其具有uint8_t tab = {0,1,1,0,0,1,1};这样的数组;

甚至有可能吗?有小费吗?在此先感谢

c++ c bit-fields
1个回答
0
投票

不是使用位字段,而是只使用uint8_t数组,并使用移位和掩码访问每个位。

uint8_t data[SIZE];
...
data[bitIndex >> 3] |= 1 << (bitIndex & 7);  // set bit at bitIndex
data[bitIndex >> 3] &= ~(1 << (bitIndex & 7); // clear bit at bitIndex
bitValue = !!(data[bitIndex >> 3] & (1 << bitIndex & 7)); // read bit at bitIndex

使用较大的类型(16、32、64)可能更有效,但需要适当地更改移位和掩码(例如,uint16_t的值为4和15)。

© www.soinside.com 2019 - 2024. All rights reserved.