バイトを使用して10101010
のようなフラグを格納していますが、特定のビットが1
または0
にあることを確認する方法を知りたいです。
これは、任意のビットをテストするために使用できる関数です。
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ビット値の左端のビットになります。
ビットごとの演算子(&)は、両側で1であるすべてのビットが設定された結果を示します。例:1111&0001 = 0001; 1111&0010 == 0010; 0000&0001 = 0000。したがって、式(value&(1 << bitindex))は、関連付けられたビットの値が1の場合はビットマスクを返し、関連付けられたビットが0の場合は0を返します。
最後に、結果がゼロ以外であるかどうかを確認します。 (これは実際には省略できますが、明示的にしたいと思います。)
@Daoksの回答の延長として
ビット操作を行うとき、それ本当には ビット演算子 の非常に確かな知識を持つのに役立ちます。
また、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++を使用していて、標準ライブラリが許可されている場合は、フラグをビットセットに格納することをお勧めします。
#include <bitset>
//...
std::bitset<8> flags(someVariable);
その場合、[]インデックス演算子を使用してフラグを確認および設定できます。
AND演算子を使用できます。あなたが持っている例:10101010そしてあなたがすることができる3番目のビットをチェックしたい:(10101010 AND 00100000)そしてあなたが00100000を得るならばあなたはあなたが1への3番目の位置にフラグを持っていることを知っています。
このような個々の分野での作業が好きな場合、クリストファー・ジョンソンの答えは非常に良いです。 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) {}
...
}
構造内でフィールドに意味のある名前を付けることができるため、同じ小さなサイズの利点に加えて、読み取り可能なコードが得られます。
これまでのところ誰も間違っていませんが、任意のビットをチェックする方法を提供します。
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
}
Daokが言うように、前のAND演算の結果にビットをOR)作成します。この場合、最終結果は1または0になります。
従来、最下位ビットが設定されているかどうかを確認するには、次のようになります。
int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
doSomething();
ビット単位(論理ではありません!)を使用して、値をビットマスクと比較します。
if (var & 0x08) {
/* the fourth bit is set */
}