Sir*_*ius 13
通过数字位置检查位是正确的方法之一,但它使代码依赖于幻数,这使得它更难以阅读和维护.
通常,在检查位掩码时,目标是检查某些特定的标志,例如硬件寄存器.
想象一下,例如,整数的每一位代表你家中的特定灯光,你想要检查浴室和厨房是否亮着:
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)) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是优雅的,易于理解,可以很容易地修改.
如果你想明确地使用位位置而不是常量,那么枚举也可以用编译器的免费位移来表示:
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
};
Run Code Online (Sandbox Code Playgroud)