检查标志是否设置为整数的最有效方法
Most efficient way to check if flags are set in an integer
我有 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.
}
P.S。
这是针对 8 位微控制器的。
C 的 if
语句和逻辑运算符在 1
和其他非零值之间没有区别(尽管逻辑运算符为 true
生成 1
)。因此,在逻辑表达式的上下文中,(a & (1 << F3)) >> F3
和 a & (1 << F3)
之间没有区别:如果一个计算结果为 true
,另一个计算结果也是如此,反之亦然。因此,这应该有效:
if (a & (1 << F1)) {
// Set bit 5 in register A.
}
注:我假设你不是想写#define F11 1024
,而是#define F11 10
,因为你使用你的F
s作为 <<
.
的第二个操作数
只需使用:
typedef enum{
FLAG1 = 1, // or 0x01
FLAG2 = 2,
FLAG3 = 4,
...
FLAG8 = 0x80
} flags;
然后在 main 中检查
if(value & FLAGN)
在 C 中,if 语句中的 1 和任何其他数字没有区别。它只是检查是零还是非零数字。
设置相同:
value = FLAG1 | FLAG2 | FLAG8;
你也可以使用 defines ofc。
并且对于 claryfication,N 位类型的最大标志数是 N。所以你需要有更大的类型(如果编译器支持更大的数据类型),比如 uint16_t。
我有 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.
}
P.S。 这是针对 8 位微控制器的。
C 的 if
语句和逻辑运算符在 1
和其他非零值之间没有区别(尽管逻辑运算符为 true
生成 1
)。因此,在逻辑表达式的上下文中,(a & (1 << F3)) >> F3
和 a & (1 << F3)
之间没有区别:如果一个计算结果为 true
,另一个计算结果也是如此,反之亦然。因此,这应该有效:
if (a & (1 << F1)) {
// Set bit 5 in register A.
}
注:我假设你不是想写#define F11 1024
,而是#define F11 10
,因为你使用你的F
s作为 <<
.
只需使用:
typedef enum{
FLAG1 = 1, // or 0x01
FLAG2 = 2,
FLAG3 = 4,
...
FLAG8 = 0x80
} flags;
然后在 main 中检查
if(value & FLAGN)
在 C 中,if 语句中的 1 和任何其他数字没有区别。它只是检查是零还是非零数字。
设置相同:
value = FLAG1 | FLAG2 | FLAG8;
你也可以使用 defines ofc。
并且对于 claryfication,N 位类型的最大标志数是 N。所以你需要有更大的类型(如果编译器支持更大的数据类型),比如 uint16_t。