2016-04-16 2 views
0

特定のバイトからすべてのビットを取得(および表示)できるユニオンを作成する必要があります。 それは理にかなっていますか?私はビット単位の演算子でそれを行う方法を知っていると思うが、同じ効果のためにどのようにユニオンを使用するか考えていない。C Union - すべての8ビットを表示する

+2

であるあなたはビットフィールドを意味しないことに注意してください代わりに?組合はそれのためではない。 – fluter

+3

ビット演算子を使用すると何が問題になりますか? –

答えて

1

ビット単位の操作を使用することをお勧めします。あなたはあまりにもビットを抽出するために労働組合とビットフィールドを組み合わせた、しかし、ノート、これは、しかし、これは推奨されない理由である、あなたの学習のためにここにサンプルエンディアンに依存することができます。

#include <stdio.h> 
#include <string.h> 

union Bits { 
    char b; 
    struct bits { 
#ifdef LITTLE_ENDIAN 
      unsigned int b0: 1; 
      unsigned int b1: 1; 
      unsigned int b2: 1; 
      unsigned int b3: 1; 
      unsigned int b4: 1; 
      unsigned int b5: 1; 
      unsigned int b6: 1; 
      unsigned int b7: 1; 
#else 
      // reverse the order of the bit fields. 
#endif 
    } bits; 
}; 

int main(void) { 
    char a = 'A'; 
    union Bits b; 
    b.b = a; 

    printf("0x%x\n", a); 
    printf("%d%d%d%d%d%d%d%d\n", b.bits.b7, b.bits.b6, b.bits.b5, b.bits.b4, b.bits.b3, b.bits.b2, b.bits.b1, b.bits.b0); 

    return 0; 
} 

この出力すべき

0x41 
01000001 
+0

いいえ。ビットフィールドの順序を指定することはできません。ビットフィールドの順序は実装定義です。 ** ** 6.7.2.1 [C標準](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)のパラグラフ11の構造および連合指定子**、 ...単位内のビットフィールドの割り当て順序(上位から の下位または下位から上位への)は実装定義です... " –

+0

これは実装定義であり、その理由は私はエンディアンと携帯ではなく、ビットフィールドの順序を述べることはできないと言いました。 :) – fluter

+0

これはエンディアンに依存するだけではなく、異なるコンパイラがビットフィールドを異なる方法で扱うことができます。だからあなたは本当にどちらのビットがどれか分からない。それらのうちのいくつかもそれをねじ込む:https://lwn.net/Articles/478657/ –

1

8ビットのビットフィールドを含むunit8_tstructの和集合を使用できます。ただし、それによって個々のビットにアクセスできるようになりますが、それらのビットがどれか分かりません。これは、コンパイラがビットフィールドを基になるバイトに割り当てる方法に依存します。これはターゲットマシンのエンディアンに依存します。

this SO Q&Aを参照してください。

+0

**あなたはどのビットであるか分からないでしょう!**それを指摘してくれてありがとう。 –

1

C99は、我々は物事が容易になり、匿名の構造体と共用体を持っているので:

#include <stdio.h> 
#include <stdbool.h> 
#include <inttypes.h> 

union disByte 
{ 
    uint8_t byte; 
    // Assuming little endian 
    struct { 
     bool b0: 1; 
     bool b1: 1; 
     bool b2: 1; 
     bool b3: 1; 
     bool b4: 1; 
     bool b5: 1; 
     bool b6: 1; 
     bool b7: 1; 
    }; 
}; 

int main() 
{ 
    union disByte foo; 
    foo.byte = 42; 
    printf("%d %d %d %d %d %d %d %d\n", foo.b0, foo.b1, foo.b2, foo.b3, foo.b4, foo.b5, foo.b6, foo.b7); 
} 

ただし、ビット操作が通常好ましい(あなたの質問は、ビットmanipulati」タグ付けされていますに")。ビット操作を使用しての

#define XTH_BIT_OF(NUM, X) (bool)(NUM & (1U << X)) 

利点は以下のとおりです。

  1. あなたはエンディアンを心配する必要はありません。
  2. もっと短くて鮮明に見えます。
  3. あなたはこのようにこれを行うには、ビットフィールドと組合を使用することができます
1

#include <stdio.h> 


typedef union { 
     struct { 
      unsigned int:0; 
      unsigned int firstBit : 1; 
      unsigned int secondBit : 1; 
      unsigned int thirdBit : 1; 
      unsigned int fourthBit : 1; 
      unsigned int fifthBit : 1; 
      unsigned int sixthBit : 1; 
      unsigned int seventhBit : 1; 
      unsigned int eigthBit : 1; 
     }; 
     int raw; 
} bitsOfByte; 

int main() 
{ 
bitsOfByte dt; 
dt.raw = 254; 
printf("Bits are %d/%d/%d/%d/%d/%d/%d/%d", dt.firstBit, dt.secondBit, dt.thirdBit, dt.fourthBit, dt.fifthBit, dt.sixthBit, dt.seventhBit, dt.eigthBit); 
return 0; 
} 

この実装では、最初のビットは、下位ビット

+0

これはC99固有のものです –

関連する問題