-6

誰かがフラグとビットフィールドとは何かを説明してもらえますか? それらは互いに関連しているように見えます。または、間違った考えを持っているかもしれません。私は彼らが何をしているのか、何をしているのかを少し理解していますが、完全に説明してもらいたいのですが、良いチュートリアルやガイドが本当に見つかりません.

誰かがそれらの使用方法などについていくつかの良い例を挙げてくれると本当にありがたいです.例えば、私はいつもこの種の表現を見ていて、それらを完全に理解していません. それらがある種の論理演算子か何かであるというだけです

  VARIABLE1 | VARIABLE2

前もって感謝します!

4

4 に答える 4

4

ビット演算の概要については、http: //www.codeproject.com/Articles/2247/An-introduction-to-bitwise-operatorsを参照してください。

フラグに適用されるため、ビット演算は非常に高速でスペースを節約できるという利点があります。相互に排他的なビットを使用して、オブジェクトのさまざまな状態を 1 つの変数に格納できます。すなわち

0001 // property 1 (== 1, 0x01)
0010 // property 2 (== 2, 0x02)
0100 // property 3 (== 4, 0x04)
1000 // property 4 (== 8, 0x08)

これらは、オブジェクトの 4 つの異なるプロパティを表すことができます (これらは「マスク」です)。以下を使用して、オブジェクトのフラグ状態にプロパティを追加できますor

short objState = 0; // initialize to 0
objState |= 0010;

これは、0010 を 0000 で「or」することにより、上記のプロパティ 2 を objState に追加し、結果は 0010 になります。次のように別のフラグ/プロパティを追加すると:

objState |= 0100;

最終的に objState = 0110 になります。

これで、オブジェクトにプロパティ 2 のフラグが設定されているかどうかを確認できます。たとえば、次のように使用しandます。

if (objState & 0010) // do something

and両方のビットが 1 の場合にのみ 1 であるため、ビット 2 が 1 の場合、上記の演算は非ゼロであることが保証されます。

前述したように、オブジェクトのプロパティ/フラグを処理するこの方法の利点は、速度と効率の両方です。このように考えてみてください。このメソッドを使用して、一連のプロパティを単一の変数に格納できます。

たとえば、ファイル タイプがあり、ビット マスクを使用してプロパティを追跡したいとします (ここではオーディオ ファイルを使用します)。おそらく、ビット 0 ~ 3 はファイルのビット深度を格納でき、ビット 4 ~ 7 はファイル タイプ (Wav、Aif など) を格納できます。次に、この 1 つの変数をさまざまな関数に渡すだけでよく、数十の変数を追跡する代わりに、定義したビットマスクを使用してテストできます。

ビットごとの操作の少なくともこの 1 つのアプリケーションに光を当てることを願っています。

于 2013-03-10T01:18:21.203 に答える
0

「フラグ」は、設定または設定できない概念的なオブジェクトですが、C++言語の一部ではありません。

ビットフィールドは、アドレス指定可能なオブジェクトを構成しない可能性のあるビットのセットを使用するための言語構造です。単一ビットのフィールドは、フラグを実装する方法の1つです---多くの場合非常に優れています---。

于 2013-03-10T01:09:56.070 に答える
0

「バイフィールド」は、 1つの変数に一緒に格納される「ワード」(つまり、、、または)の1つ以上のビットのセットintですlongchar

たとえば、一部の動物に「なし」、「斑点」、および/または「縞模様」を付けることができます。また、「なし、短い、中程度、または長い」尾を持つこともできます。

したがって、尾の長さを表すには2ビットが必要です。

enum tail
{
   tail_none = 0,
   tail_short = 1, 
   tail_medium = 2, 
   tail_long = 3
};

次に、これらをビットとして「属性」に格納します。

enum bits_shifts
{
   tail_shift = 0,    // Uses bits 0..1
   spots_shift = 2,   // Uses bit 2
   stripes_shift = 3
};


enum bits_counts
{
   tail_bits = 2,    // Uses bits 0..1
   spots_bits = 1,   // Uses bit 2
   stripes_bits = 1
};

ここで、いくつかの入力からtail_size変数とhas_stripes変数has_spots変数をフェッチしたと仮定します。

int attributes;

attributes = tail_length << tail_shift;

if (has_spots)
{
   attributes |= 1 << spots_shift;
}

if (has_stripes)
{
   attributes |= 1 << stripes_shift;
}

後で、属性が何であるかを理解したいと思います。

switch((attributes >> tail_shift) & (1 << tail_bits)-1))
{
   case tail_none:
     cout << "no tail";
     break;

   case tail_short:
     cout << "short tail";
     break;

   case tail_medium:
     cout << "medium tail";
     break;

   case tail_short:
     cout << "long tail";
     break;
 }

 if (attributes & (1 << stripes_shift))
 {
    cout << "has stripes";
 }


 if (attributes & (1 << spots_shift))
 {
    cout << "has spots";
 }

これで、これらすべてを1つの整数に格納してから、再度「釣り上げ」ました。

もちろん、次のようなこともできます。

enum bitfields
{
    has_widget1 = 1,
    has_widget2 = 2,
    has_widget3 = 4, 
    has_widget4 = 8, 
    has_widget5 = 16,
    ...
    has_widget25 = 16777216, 
    ...
}

int widgets = has_widget1 | has_widget5;

... 

if (widgets & has_widget1)
{
  ... 
}

これは、いくつかのものを1つの変数にパックする簡単な方法です。

于 2013-03-10T01:16:12.327 に答える
0

整数値のビットはブール値として使用できます。

http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx

で作成し|、 で取得し&ます。

enum { ENHANCED_AUDIO = 1, BIG_SPEAKERS = 2, LONG_ANTENNA = 4};

foo(HAS_CAR | HAS_SHOE); // equiv to foo(3);

void processExtraFeatures(flags) {
    BOOLEAN enhancedAudio = flags & ENHANCED_AUDIO; // true
    BOOLEAN bigSpeakers = flags & BIG_SPEAKERS; // true
    BOOLEAN longAntenna = flags & LONG_ANTENNA; // false
}
于 2013-03-10T00:57:53.287 に答える