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あります。

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

注:の 2 番目のオペランドとして sを使用しているため#define F11 1024、 ではなくを書くつもりだったと思います。#define F11 10F<<

于 2016-12-04T21:32:30.007 に答える