0

我有 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 个 if 是这样的:

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

PS 这是一个 8 位微控制器。

4

2 回答 2

2

C 的语句和逻辑运算符在和其他非零if之间没有区别(尽管逻辑运算符产生for )。因此,在逻辑表达式的上下文和上下文中没有区别:如果一个计算结果为,则另一个计算结果为 ,反之亦然。因此,这应该有效:11true(a & (1 << F3)) >> F3a & (1 << F3)true

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

注意:我假设您不是要写#define F11 1024,而是#define F11 10因为您使用Fs 作为 的第二个操作数<<

于 2016-12-04T21:32:30.007 回答
2

只需使用:

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

然后在主要检查

if(value & FLAGN)

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

设置是一样的:

value = FLAG1 | FLAG2 | FLAG8;

您也可以使用定义 ofc。

为了澄清起见,N位类型的最大标志数是N。所以你需要有更大的类型(如果编译器支持更大的数据类型),比如uint16_t。

于 2016-12-04T21:40:19.243 回答