14

私はこのように宣言されたビットフィールドを持っています:

typedef struct morder {
    unsigned int targetRegister : 3;
    unsigned int targetMethodOfAddressing : 3;
    unsigned int originRegister : 3;
    unsigned int originMethodOfAddressing : 3;
    unsigned int oCode : 4;
} bitset;

私はint配列も持っており、このビットフィールドの実際の値を表すこの配列からint値を取得したいと考えています(実際には、その一部を持っているある種のマシンワードであり、int表現が必要です単語全体)。

4

3 に答える 3

25

ユニオンを使用しないでください。むしろ、ユニオンを使用する前に、ユニオンを使用して何をしているのかを理解してください。

この回答でわかるように、ビットフィールドが移植可能であることに依存しないでください。特にあなたの場合、構造体内のビットフィールドの順序は実装に依存します。

さて、あなたの質問が、ビットフィールド構造体を int として出力するにはどうすればよいかということだった場合、時折のプライベート レビューのために、確かに、共用体は素晴らしいものです。しかし、ビットフィールドの「実際の値」が必要なようです。

したがって、この 1 つのマシンとコンパイラの組み合わせだけで作業し、int の数学的な値に依存する必要がない場合は、それが理にかなっている限り、union を使用できます。ただし、コードを移植する可能性がある場合、または int の「実際の値」が必要な場合は、ビット操作コードを記述して、ビット フィールドを正しい int ビットに変換する必要があります。

于 2010-03-18T10:10:13.657 に答える
16

ユニオンを使用できます。

typedef union bitsetConvertor {
    bitset bs;
    uint16_t i;
} bitsetConvertor;

bitsetConvertor convertor;
convertor.i = myInt;
bitset bs = convertor.bs;

または、キャストを使用できます。

bitset bs = *(bitset *)&myInt;

または、ユニオン内で匿名の構造体を使用できます。

typedef union morder {
    struct {
        unsigned int targetRegister : 3;
        unsigned int targetMethodOfAddressing : 3;
        unsigned int originRegister : 3;
        unsigned int originMethodOfAddressing : 3;
        unsigned int oCode : 4;
    };

    uint16_t intRepresentation;
} bitset;

bitset bs;
bs.intRepresentation = myInt;
于 2010-03-18T09:42:32.557 に答える
2

ユニオンを使用するだけです。次に、16ビット整数または個別のビットフィールドとしてデータにアクセスできます。

#include <stdio.h>
#include <stdint.h>

typedef struct {
    unsigned int targetRegister : 3;
    unsigned int targetMethodOfAddressing : 3;
    unsigned int originRegister : 3;
    unsigned int originMethodOfAddressing : 3;
    unsigned int oCode : 4;
} bitset;

typedef union {
    bitset b;
    uint16_t i;
} u_bitset;

int main(void)
{
    u_bitset u = {{0}};
    
    u.b.originRegister = 1;
    printf("u.i = %#x\n", u.i); 

    return 0;
}
于 2010-03-18T09:42:14.943 に答える