0

プロトコルは次のとおりです。

(four byte hour/minute/second field, for example (12:13:56 110))
bit00~bit01: 00
bit02~bit11: millisecond (110)
bit12~bit15: second-1s   (6)
bit16~bit18: second-10s  (5)
bit19~bit22: minute-1s   (3)
bit23~bit25: minute-10s  (1)
bit26~bit29: hour-1s     (2)
bit30~bit31: hour-10s    (1)

上部構造はどのように定義すればよいですか?

私はこれを定義しようとしました:

struct xxx_time 
{
    unsigned int pad:2;
    unsigned int second0:4;
    unsigned int second1:3;
    unsigned int minute0:4;
    unsigned int minute1:3;
    unsigned int hour:4;
    unsigned int hour1:2;
};

このように定義するのは正しいですか?もっと良い方法はありますか?

4

4 に答える 4

1

構造体のビット フィールドのメモリ レイアウトは、コンパイラによって定義されます。リストした順序でコンパイラが構造体フィールドをレイアウトするという保証はありません。たとえば、パッド フィールドは構造体の最初の 2 ビットではない場合があります。ビットフィールドを持つ構造体のメモリ レイアウトおよびビット フィールドでビット エンディアンが問題になる理由を参照してください。.

したがって、ビット フィールドを持つ構造体を使用して、定義済みの基になるメモリ レイアウトをマップすることはできません。指定されたメモリ レイアウトでバッファを読み書きするには、ビット シフトとマスクを使用する必要があります。

于 2013-07-16T02:51:17.737 に答える
1

ミリ秒フィールドを忘れたことを除けば、問題ないと思います。

struct xxx_time 
{
    unsigned int pad:2;
    unsigned int milisecond:10;
    unsigned int second0:4;
    unsigned int second1:3;
    unsigned int minute0:4;
    unsigned int minute1:3;
    unsigned int hour:4;
    unsigned int hour1:2;
};

また、padフィールドが本当にパディング用である場合 (操作しない場合)、名前のないフィールドを使用できます。

struct xxx_time 
{
    unsigned int :2;
    unsigned int milisecond:10;
    //...
}

ビットフィールドに関するほとんどすべてが実装に依存することに注意してください。

于 2013-07-16T02:42:52.017 に答える
0

あなたのレイアウトは、最近の gcc コンパイラ (および icc などの互換機) で動作します。

また、ビッグ エンディアンのマシンでは、構造体を「反転」する必要があります。

struct xxx_time {
#ifdef WORDS_BIGENDIAN
    unsigned int hour1:2;
    unsigned int hour:4;
    unsigned int minute1:3;
    unsigned int minute0:4;
    unsigned int second1:3;
    unsigned int second0:4;
    unsigned int milisecond:10;
    unsigned int:2;
#else
    ...
#endif
};

実装定義の動作に関する注意事項は引き続き適用されるため、おそらくコンパイラが生成するものを確認する必要があります。

C11 (および gnu99) では無名構造が許可されているため、これは共用体を使用して簡単に実行でき、コードを変更する必要はありません (struct 型の宣言のみを変更する必要があります)。

union xxx_time_u {
    uint32_t ival;
    struct {
#ifdef WORDS_BIGENDIAN
        unsigned int hour1:2;
        ...
#else
        unsigned int:2
        ...
#endif
    };
};
于 2013-07-16T04:03:18.140 に答える
0

これらのデータを使用して何をしたいかによると思います。データ構造の 1 つの目標は、システム処理に役立つデータの格納とアクセスをより適切または効果的に行うことです。

例えば、あなたが書いた時、分を知りたい、処理したいのであればOKです。全体の時間だけを気にする場合は、1 回の変数で問題ありません。

これらのデータをどのように使用するかは、要件によって異なります。

于 2013-07-16T02:41:06.213 に答える