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

时间:2016-12-04 21:28:43

标签: 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.
}

P.S。 这适用于8位微控制器。

2 个答案:

答案 0 :(得分:2)

C if语句和逻辑运算符在1和其他非零之间没有区别(尽管逻辑运算符为1生成true) 。因此,在逻辑表达式的上下文中(a & (1 << F3)) >> F3a & (1 << F3)之间没有区别:如果一个评估为true,另一个评估为if (a & (1 << F1)) { // Set bit 5 in register A. } ,反之亦然。因此,这应该工作:

#define F11 1024

注意:我认为您不是要写#define F11 10,而是F,因为您使用<<作为第二个(ns huffman.core (:use [clojure.java.io :only [output-stream]])) (defn use-output-stream-1 [] (with-open [o (output-stream path)] (.write o (unchecked-byte 255)) (.write o (unchecked-byte (Integer/parseInt "01010101" 2))) )) (defn rb [b] (unchecked-byte (Integer/parseInt b 2))) (defn use-output-stream-2 [] (with-open [o (output-stream path)] (.write o (unchecked-byte 255)) (.write o (rb "01010101")) )) 的操作数。

答案 1 :(得分:2)

只需使用:

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

然后在主要检查

if(value & FLAGN)

在C语句中,if语句中的1和任何其他数字之间没有差异。它只检查零或非零数字。

设置是一样的:

value = FLAG1 | FLAG2 | FLAG8;

您也可以使用c的定义。

对于claryfication,N位类型的最大标志数为N.所以你需要更大的类型(如果compiller支持更大的数据类型),如uint16_t。