如何获取第n位值 [英] How to get nth bit values

查看:0
本文介绍了如何获取第n位值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是位移位和c++的新手。

假设我有一个uint8_t 00100100(36),我想检查是否设置了第3位。 以下是我现在如何做到这一点的代码,只需要一点时间。

uint8_t x = 36;
    if(x&1<<3)
        printf("is set");

如何检查是否设置了第3位第6位?我想检查几种位的组合,如第5位、第7位或第8位。

最优雅的方式是什么?

推荐答案

按数字位置校验位是正确的方法之一,但这会使代码依赖于幻数,从而增加读取和维护的难度。

通常,在检查位掩码时,目标是检查某个特定标志,例如硬件寄存器。

例如,假设整数的每一位都代表您房子中的一个特定灯光,并且您想要检查浴室和厨房是否打开:

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
};

这篇关于如何获取第n位值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆