2011-10-19 3 views
12

int/otherデータ型にフラグが存在するかどうかを確認するために通常使用されるメソッドがありますか?フラグが存在するかビット単位でチェックする

if ((host&flagtocheckfor)==flagtocheckfor) 

これはうまくいきますが、これはフラグを設定する一般的な方法ですが、これはフラグが通常チェックされる方法ですか?または、より簡潔な方法がありますか?

+2

ます== flagtocheckforの部分は必要ありません。 &の結果は0(ビットがオフ)または0(ビットがオン)であり、Cでは少なくともFalseおよびTrueに対応しています。 – librik

+1

@librik、それはシングルビットマスクでは問題ありませんが、マルチビットでも可能です。私の答えを見てください。 – paxdiablo

答えて

23

これはかなりうまいです。正確にはウェイビットフラグは、それらをサポートするほとんどの言語でチェックされています。例えば

場合 のいずれか、それはtrueを返しますので、実際には第二のために動作しません
if ((flag & BIT_7) != 0) ... 

#define BIT_7 0x80 
#define BITS_0_AND_1 0x03 

if ((flag & BIT_7) == BIT_7) ... 
if ((flag & BITS_0_AND_1) == BITS_0_AND_1) ... 

あなたが最初のようなものを確認することができますがビットは、ではなく、設定されます。完全のために

、Cはあなたとビットマスクを設定することができます:あなたがそれらをクリアすることができます

flag = flag | BIT_7; // or you can also use 'flag |= BIT_7' 

flag = flag & (~BIT_7); 

そしてそれらを切り替える:

flag = flag^BIT_7; 
+0

Aha-ありがとう、私は確信が持てませんでした。 – ultifinitus