c - 检查标志是否设置为整数的最有效方法

标签 c bitflags

我有 11 个标志定义为:

#define F1 1
#define F2 2
#define F3 3
#define F4 4
...
#define F11 11

然后在某些函数中我创建了一个整数,它可以包含这些标志中的任何一个,例如:

int a = (1 << F1) | (1 << F5) | (1 << F11) | (1 << F8);

然后将其传递给一个函数,该函数需要解码设置了哪些标志,以便在特定寄存器中设置特定位。所以我的问题是,检查设置了哪些标志的最有效方法是什么。现在我有 11 个如果是这样的:

void foo(int a) 
{
    if ((a & (1 << F1)) >> F1) {
        // Set bit 5 in register A.
    }

    if ((a & (1 << F2)) >> F2) {
        // Set bit 3 in register V.
    }

    if ((a & (1 << F3)) >> F3) {
        // Set bit 2 in register H.
    }

    if ((a & (1 << F4)) >> F4) {
        // Set bit 1 in register V.
    }

    // And so on, for all 11 flags.
}

附言 这是针对 8 位微 Controller 的。

最佳答案

只需使用:

typedef enum{
    FLAG1 = 1, // or 0x01
    FLAG2 = 2,
    FLAG3 = 4,
    ...
    FLAG8 = 0x80
} flags;

然后在主要检查

if(value & FLAGN)

在 C 中,if 语句中的 1 和任何其他数字没有区别。它只是检查是零还是非零数。

和设置是一样的:

value = FLAG1 | FLAG2 | FLAG8;

您也可以使用 defines ofc。

对于 claryfication,N 位类型的最大标志数是 N。所以你需要有更大的类型(如果编译器支持更大的数据类型),比如 uint16_t。

关于c - 检查标志是否设置为整数的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40963882/

相关文章:

c - 刽子手 : ending the game if player guesses all letters

c++ - C 函数可以运行,C++ 版本不行

c - 确定字节中的哪一位被设置

c - -D name=definition and bitwise operator

c - 我在 '=' token 之前收到以下错误 : expected ',' , ';' 、 'asm' 、 '__attribute__' 或 '{' 。我如何解决它?

C 和汇编 __asm 不工作

c - 如何编写测试CPU和内存之间带宽的程序?(使用C或C++)

php - PHP 中函数的二进制标志

c++ - 在 C++ 中键入安全(r)位标志?

language-agnostic - 如何选择位标志值?