在 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;
}
我想创建特定字节 - 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:7uint8_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;
}