バイトを使用して のようなフラグを格納します。特定のビットがまたは10101010
であることを確認する方法を知りたいです。1
0
10 に答える
必要なビットをテストするために使用できる関数を次に示します。
bool is_bit_set(unsigned value, unsigned bitindex)
{
return (value & (1 << bitindex)) != 0;
}
少し説明:
ビット マスクを作成するには、左シフト演算子 (<<) を使用します。(1 << 0) は 00000001 に等しくなり、(1 << 1) は 00000010 に等しくなり、(1 << 3) は 00001000 に等しくなります。したがって、0 のシフトは右端のビットをテストします。31 のシフトは、32 ビット値の左端のビットになります。
ビット AND 演算子 (&) は、両側で 1 であるすべてのビットが設定された結果を返します。例: 1111 & 0001 = 0001; 1111 & 0010 == 0010; 0000 & 0001 = 0000. したがって、式 (value & (1 << bitindex)) は、関連するビットの値が 1 の場合はビットマスクを返し、関連するビットが 0 の場合は 0 を返します。
最後に、結果が非ゼロかどうかを確認します。(これは実際には省略される可能性がありますが、私は明示したいと思います。)
Patrick Desjardins の回答の延長として:
ビット操作を行う場合、ビット単位の演算子に関する非常に確かな知識があると非常に役立ちます。
また、C のビットごとの「AND」演算子は&
であるため、次のようにします。
unsigned char a = 0xAA; // 10101010 in hex
unsigned char b = (1 << bitpos); // Where bitpos is the position you want to check
if(a & b) {
//bit set
}
else {
//not set
}
上記では、ビット単位の "AND" (C では &) を使用して、特定のビットが設定されているかどうかを確認しました。また、2 進数を定式化する 2 つの異なる方法を使用しました。上記のウィキペディアのリンクを確認することを強くお勧めします。
このような個々のフィールドで作業するのが好きなら、クリストファー・ジョンソンの答えはとても良いです。C のビット フィールドを使用して、コードを読みやすくすることを好みます。
例えば:
struct fieldsample
{
unsigned short field1 : 1;
unsigned short field2 : 1;
unsigned short field3 : 1;
unsigned short field4 : 1;
}
ここでは、それぞれのサイズが 1 ビットの 4 つのフィールドを持つ単純な構造体があります。次に、単純な構造アクセスを使用してコードを記述できます。
void codesample()
{
//Declare the struct on the stack.
fieldsample fields;
//Initialize values.
fields.f1 = 1;
fields.f2 = 0;
fields.f3 = 0;
fields.f4 = 1;
...
//Check the value of a field.
if(fields.f1 == 1) {}
...
}
構造内でフィールドに意味のある名前を付けることができるため、サイズが小さいという利点に加えて、読みやすいコードが得られます。
AND 演算子を使用できます。あなたが持っている例: 10101010 で、実行できる 3 番目のビットをチェックしたい: (10101010 AND 00100000) 00100000 を取得した場合、3 番目の位置に 1 のフラグがあることがわかります。
C++ を使用していて、標準ライブラリが許可されている場合は、フラグをビットセットに格納することをお勧めします。
#include <bitset>
//...
std::bitset<8> flags(someVariable);
[] インデックス演算子を使用して、フラグを確認および設定できます。
これまでのところ誰も間違っていませんが、任意のビットをチェックする方法を提供するには:
int checkBit( byte in, int bit )
{
return in & ( 1 << bit );
}
関数がゼロ以外を返す場合、ビットが設定されます。
byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set
int isThirdBitSet(byte in) {
return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise
}
Patrick Desjardins が言うように、前の AND 演算の結果に対してビット単位の OR を作成できます。
この場合、最終結果は 1 または 0 になります。
従来、最下位ビットが設定されているかどうかを確認するには、次のようにします。
int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
doSomething();
ビット単位の (論理的ではない) AND を使用して、値をビットマスクと比較します。
if (var & 0x08) {
/* The fourth bit is set */
}