如何获得第n位值

use*_*254 6 c++ bits bit-shift

我对整个位移和c ++都很陌生.

假设我有一个uint8_t 00100100(36),我想检查第3位是否已设置.以下是我现在只做一点的代码.

uint8_t x = 36;
    if(x&1<<3)
        printf("is set");
Run Code Online (Sandbox Code Playgroud)

如何检查第3 位第6位是否已设置?我想检查几个比特组合,如第5或第7或第8.

什么是最优雅的方式呢?

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)