- ベストアンサー
UINT64→UINT32[2]にする方法
UINT64 の値を、UINT32の配列[2]に格納する方法を教えてください。 シフト演算がよくわかりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
UINT64 a; UINT32 b[2]; aの値が0xAAAAAAAAEEEEEEEEとして 上位32ビット(0xAAAAAAAA)をb[0] 下位32ビット(0xEEEEEEEE)をb[1]に格納したいのなら b[0] = a >> 32;(aの上位32ビットぶんを右へ32ビットシフトした結果を格納) b[1] = 0xFFFFFFFFLL & a;(aの上位32ビット分を全て0にして、下位32ビットぶんのみを格納) とすれば、格納できます。
その他の回答 (4)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
他のシステムに受け渡す必要がなければ、 union { UINT64 U64; UINT32 U32[2]; } transWk; という変数を定義して、 transWk.U64 = 値; で、 transWk.U32[0] と、transWk.U32[1] を参照するとか、 逆に、 transWk.U32[0] = 値; transWk.U32[1] = 値; で、transWk.U64 を参照するとかでできることが多いです。 もっと単純には、 UINT64 a; UINT32 b[2]; に対して、 b[0] = a / 0x10000; b[1] = a % 0x10000; で変換するとか。 逆に戻すには、 a = b[0] * 0x10000LL + b[1]; // こっちは 0x10000 に LL のサフィックスが必要なはず とか、そういう方法もあります。
お礼
ご回答ありがとうございます。 戻し方まで教えて頂いて、とても勉強になりました。
- jacta
- ベストアンサー率26% (845/3158)
UINT64とかUINT32の素性がわかりません(想像は付きますが...)。 標準外の用語を使うのであれば、その定義を明確にしてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
「シフト演算がよくわからない」とはどういうことでしょうか? 自然に書けばいいのですが.
- pokapoka1980
- ベストアンサー率41% (48/117)
UINT64 a; UINT32 b[2]; memcpy((void*)b, (void*)&a, sizeof(UINT64)); とか?
お礼
ご回答ありがとうございます。 シフト演算を使用しての実現方法を考えていました。 参考にします。
お礼
ご回答ありがとうございます。 下位32ビットはこういうふうに格納するんですね。 勉強になりました。