在 c/c++ 中对移位字节使用枚举

use of enum on shift bytes in c/c++

我想创建特定字节 - uint8_t 以将其设置在寄存器中。

这个字节由2个部分组成。位 <7:6> 是一个乘数。

这2位可以是: 00 与 1 相乘 01 与 4 相乘 10 乘以 16 11 与 64

相乘

对于这 2 位,我使用的枚举如下:

typedef enum multiFactorEnum{
FACTOR_1,
FACTOR_4,
FACTOR_16,
FACTOR_64
}MultiFactor;

对于其余字节,它可以是 1 - 63(代表时间)之间的任何数字,因为如果您将位 <5:0> 设置为 1,这就是值。

所以当我知道我应该使用什么因素时,我正在创造价值作为

uint8_t val = (MultiFactor::FACTOR16 << 6 ) | timeValue;

这给我一个问题:

'<<' in boolean context, did you mean '<'

我试图将枚举转换为 uint8_t,但它不正确。

typedef enum{
    FACTOR_1 = 0,
    FACTOR_4 = 1 << 6,
    FACTOR_16 = 2 << 6,
    FACTOR_64 = 3 << 6,
}MultiFactor;
uint8_t val = MultiFactor::FACTOR_16 | timeValue;

如果您需要在 ORing

之前清除时间值中的位 6:7
uint8_t val = MultiFactor::FACTOR_16 | (timeValue & ~MultiFactor::FACTOR_64);

如果愿意,您也可以在联合中使用位域;它做同样的事情,但可能更直观一点:

typedef enum {
    factor_1  = 0,
    factor_4  = 1,
    factor_16 = 2,
    factor_64 = 3,
} factors_;


union Register{
    struct {
        uint8_t time: 6;
        uint8_t factor: 2;
    };
    uint8_t out;
};

int main() {
    Register myRegister;
    myRegister.factor = factor_64;
    myRegister.time = 1;
    uint8_t registerToSet = myRegister.out;
    return 0;
}