0

タイトルが少しわかりにくい場合は申し訳ありませんが、完全な説明は次のとおりです。

次の構造があるとします。

union data {
    struct{
        uint32_t h : 16;
        uint32_t p : 16;
    };
    uint32_t f;
};

および次のコード:

struct data d;
d.f = 0xbaadf00d;
printf("%d %d\n", d.h, d.p);

私の質問は次のとおりです。ビット単位の操作を使用してこれを行う同等の方法はありますか? 何かのようなもの:

uint32_t u32 = 0xbaadf00d;
uint32_t h = u32 ... some hacks ...
uint32_t p = u32 ... some more hacks ...

説明および/または参照を読んで回答をいただければ幸いです。

4

1 に答える 1

4
uint32_t d=0xbaadf00d;
printf("%d %d\n", d>>16, d&0xffff);

d>>16右シフトを実行し、上位ビットを右に 16 位置移動し (上位位置にゼロを挿入)、上位 16 ビットを抽出します (dより広いタイプの場合は、kill するためにマスクも適用する必要があることに注意してください)不要な上位ビット)。

d&0xffff最下位 16 ビットのみを通過させるマスクを適用します。これは、0xffffが下位 16 ビットがすべて設定された整数であり、AND 演算によってマスク内の 1 に対応するビットのみが変更されないためです。

一般的に、パターンは次のようになります。

(d>>n) & m

は関心のある右端nのビットの位置であり、m抽出するフィールドの幅と同じ数のバイナリ 1 で作成されたマスクです。

ちなみに、標準に関する限り、元のメソッドは未定義の動作を示すことに注意してください。

于 2013-10-21T11:18:53.267 に答える