8

これについてもっと学び、プロジェクトに実装しようとしています。

私は現在、基本的にこれを持っています:

unsigned char flags = 0; //8 bits

flags |= 0x2; //apply random flag

if(flags & 0x2) {
   printf("Opt 2 set");
}

今、もう少し複雑なことをしたいと思っています。やりたいことは、次のような 3 つのフラグを適用することです。

flags = (0x1 | 0x2 | 0x4);

そして、フラグ0x1を削除し0x2てから?私は、ビット単位の NOT を適用して (およびビット単位の AND を適用して)、次のようなことができると考えました。

flags &= ~(0x1 | 0x2);

どうやら彼らはそこに残っているか、私がチェックするとどちらかの方法で残っています。

ビットフラグに存在しないかどうかを確認する方法もわかりません(したがって、以前のコードが機能するかどうかを確認できません)。

if(flags & ~0x2) 
    printf("flag 2 not set");

最近の検索では、これに当てはまるリソースが見つかりません。他の人に教えるためにこれを学びたいと思っています。本当に興味があります。これが紛らわしいまたは単純な場合はお詫び申し上げます。

4

2 に答える 2

22

そして、それから2つ削除しますか?私はこのようなことができると思いました:

flags &= ~(0x1 | 0x2);

これらの2つのフラグを削除しますが、どうやらそれらはそこに残っているか、どちらかの方法で残っています。

これがフラグを削除する正しい方法です。その行の後にある場合printf("%d\n", flags)、出力は4.

それらがビットフラグに存在しないかどうかを確認する方法もわかりません(したがって、以前のコードが機能するかどうかを確認できません)。

if(flags & ~0x2) 
    printf("flag 2 not set");

いいえ:

if ((flags & 0x2) == 0)
    printf("flag 2 not set");

編集:

複数のフラグの存在をテストするには:

if ((flags & (0x1 | 0x2)) == (0x1 | 0x2))
    printf("flags 1 and 2 are set\n");

複数のフラグがないことをテストするには、前と同じように 0 と比較します。

if ((flags & (0x1 | 0x2)) == 0)
    printf("flags 1 and 2 are not set (but maybe only one of them is!)\n");
于 2010-11-16T06:19:59.527 に答える
11

クリア操作が機能しないとあなたが考える理由がわかりません。

flags &= ~(0x1 | 0x2);

それを行う正しい方法です。ビット設定されていないかどうかを確認する操作は次のとおりです。

if (!(flags & 0x2)) ...

あなたが持っているもの:

if (flags & ~0x2) ...

他のビットが設定されている場合は true になります。これがおそらく、クリア操作が機能していない理由です。問題は清算ではなくチェックにあります。

グループ内のすべてのビットが設定されていることを確認する場合:

if ((flags & (0x2|0x1)) == 0x2|0x1) ...
于 2010-11-16T06:20:41.780 に答える