我对整个位移和c++都不陌生。
假设我有一个uint8_t 00100100
(36),我想检查是否设置了第3位。
这是我现在只用一点代码的代码。
uint8_t x = 36;
if(x&1<<3)
printf("is set");
我如何检查第3位或的第6位是否已设置?我想检查位的几种组合,例如5th或7th或8th。
最优雅的方法是什么?
最佳答案
通过数字位置检查位是正确的方法之一,但是它使代码依赖于魔数(Magic Number),这使得读取和维护更加困难。
通常,在检查位掩码时,目标是检查某些特定标志,例如硬件寄存器。
想象一下,例如,整数的每一位代表您房屋中的特定照明,您想检查一下浴室和厨房是否开着:
enum LightMask {
ENTRANCE = 0x01,
LIVING_ROOM = 0x02,
RESTROOM = 0x04,
KITCHEN = 0x08,
BATHROOM = 0x10,
BEDROOM1 = 0x20,
BEDROOM2 = 0x40,
ATTIC = 0x80
};
uint8_t lightsOn = GetLightsOn();
if (lightsOn & (BATHROOM | KITCHEN)) {
// ...
}
这是优雅的,易于理解,可以很容易地进行修改。
如果您想显式地使用位位置而不是常量,则枚举也可以用位移位来表示,对于编译器来说是免费的:
enum LightMask {
ENTRANCE = 1 << 0,
LIVING_ROOM = 1 << 1,
RESTROOM = 1 << 2,
KITCHEN = 1 << 3,
BATHROOM = 1 << 4,
BEDROOM1 = 1 << 5,
BEDROOM2 = 1 << 6,
ATTIC = 1 << 7
};