2011-09-02 11 views
6

CまたはC++では、それは、変数が持っているビットの数を制限するために明らかに可能です:ビット設定質問

私は、次の変数を持つクラスを持っている場合:

unsigned char A:1; 
unsigned char B:3; 
unsigned char C:1; 
unsigned char D:3; 
  1. 上記の技術は、実際には何と呼ばれますか?
  2. クラスのサイズが4バイト以上か、サイズが1バイトですか?
  3. 変数は、示されているように1(または3)ビットとして扱われますか、または「符号なしchar」ごとに1バイトとして扱われますか?
  4. ビットを中央のバイトに組み合わせることはできますか?したがって、たとえば:

unsigned char MainByte; 
unsigned char A:1; //Can this be made to point at the first bit in MainByte? 
unsigned char B:3; //Etc etc 
unsigned char C:1; 
unsigned char D:3; 
  1. より深くこのトピックをカバー記事はありますか?
  2. 'A:1'がバイト全体のように扱われる場合、そのポイント/紫は何ですか?

その他の考慮事項(コンパイラの制限やその他の制限事項など)はお気軽にお問い合わせください。

ありがとうございます。

+3

名前は私が尋ねるべきとし –

+0

ビットフィールドです:あなたは、CまたはC++を使用していますか? C + +の場合は、非PODクラスでこれを使用していますか?私はC++がビットフィールドをPODの構造型に限定していると感じています。 –

+0

C++。私はbtohを含めていますので、仕様の違いを知っています(また、適用可能なソリューションを広げるために)。それは私が簡単にかかわらず、オーバー変更できる構造体としてのみを使用することができればとはい、私は、(それが現時点では設計段階ですが)クラスでそれを使用しています。これは、GIF画像読み込みプログラム用です。 – SSight3

答えて

8

上記の手法は実際には何と呼ばれていますか?

Bitfields。そして、あなたはcharではなく、intsignedunsignedまたはそれ以外)を "タイプ"として使用することになっています。

クラスのサイズが4バイト以上か、1バイトですか?

どちらもありません。コンパイラはワードサイズのオブジェクトを生成するため、おそらくsizeof(int)になります。ただし、実際のビットフィールドは1バイト以内に格納されます。それはいくらかのスペースを無駄にするだけです。

変数は、表示されているように1(または3)ビットとして扱われますか、「unsigned char」ごとに1バイトとして扱われますか?

これらは指定されたビットのみを表し、可能な限り厳密にパックされます。

ビットが集中バイトに結合されていますか?だから、例えば:スレッドを使用している場合例えばビットフィールドに問題があること

struct bits { 
    unsigned A:1; 
    unsigned B:3; 
    unsigned C:1; 
    unsigned D:3; 
}; 

union SplitByte { 
    struct bits Bits; 
    unsigned char Byte[sizeof(struct bits)]; 
    /* the array is a trick so the two fields 
    are guaranteed to be the same size and 
    thus be aligned on the same boundary */ 
} SplitByteObj; 

// access the byte 
SplitByteObj.Byte[0] 

// access a bitfield 
SplitByteObj.Bits.B 

注:

unionを使用してください。各ビットフィールドには個別にアクセスすることはできませんので、ミューテックスを使用して各ビットフィールドを保護しようとするとエラーになることがあります。また、フィールドが配置される順序は、標準によって明確に指定されていません。多くの人々は、その理由のためにビットフィールドを手動で実装するためにビット単位の演算子を使用することを好みます。

より深くこのトピックをカバー記事はありますか?

多くはありません。あなたがGoogleで見つけた最初の数は、あなたが見つけたすべてのものです。彼らは広く使われていません。あなたは奇妙なエッジケースに刺されないようにあなたは、彼らが働く正確にどのように把握するために標準をつべこべオフ最善でしょう。私は彼らが指定された標準のどこにいるかを正確には伝えられませんでした。

'A:1'がバイト全体のように扱われる場合、そのポイント/パープルは何ですか?

そうではありませんが、私はすでにこれを取り上げてきました。あなたが探している

+0

'(タイプ、charではなく)int(signed、unsignedなど)を使用してください。 – Sadique

+0

C99 6.7.2.1/10にはほとんど唯一の要件が定められています。多くの要件はありません。 –

+0

非常に詳細な情報をありがとうございます。 – SSight3

5

これらは、ビットフィールドです。

これらのフィールドがメモリ内にどのように配置されるかの詳細は、ほとんどの実装定義で説明されています。通常、コンパイラは何らかの方法でそれらをパックすることがわかります。しかし、それは様々な調整の問題を考慮に入れているかもしれません。

+0

ご協力いただきありがとうございます。 – SSight3