VisualStudio2015 VisualC++ Windows10 63bit
C++で32bit分取得した値から、前半の16bitと後半の16bitをそれぞれ別の変数に入れたいのですが、どのようにすればよいのでしょうか。
思いついた方法として、
「1桁ずつシフトして配列に格納し、それを順番に取り出す。」
方法を思いついたのですが、あまりにも遠回り感が否めないので、もっと効率よくできないかと思い質問いたします。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/08 08:08
回答4件
0
ベストアンサー
上位16ビット ((data>>16)&0xffff)
下位16ビット (data&0xffff)
前16ビット ((uint16_t*)&data)[0]
後16ビット ((uint16_t*)&data)[1]
ましかし、エンディアンによって結果が変わるようなコードはダメダメなので書かないようにしましょう
投稿2019/04/08 07:53
編集2019/04/08 07:58総合スコア87774
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/08 08:10
2019/04/08 08:17
2019/04/10 14:47 編集
0
こんにちは。
こんな感じでいけますよ。
C++
1#include <iostream> 2 3uint16_t high(uint32_t data) { return static_cast<uint16_t>(data >> 16); } 4uint16_t low(uint32_t data) { return static_cast<uint16_t>(data); } 5 6int main() 7{ 8 std::cout << std::hex << high(0x012345678) << "\n"; 9 std::cout << std::hex << low(0x012345678) << "\n"; 10}
static_castは本来不要ですが、msvcだと警告が出てうざいので。
投稿2019/04/08 07:45
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/08 08:12
0
HIWORD,LOWORDマクロが使えます。
参考:MAKEWPARAM, HIWORD, LOWORD マクロとは?
投稿2019/04/08 07:45
総合スコア38266
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
別解としてはstd::memcpy
を使うことでしょうか。
cpp
1std::uint32_t u32 = 4; 2std::uint16_t u16[2]; 3std::memcpy(u16, &u32, 4);
32bitの配列を16bitの配列に直すような場合はshift演算より楽かも。
なおこの手の着想でよくポインタ経由のキャストをしていたりunionを使うものが紹介されることがありますが、これらは未定義動作なのでだまされないように。
投稿2019/04/09 16:38
総合スコア5850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/10 14:26
2019/04/10 14:34
2019/04/10 14:46 編集
2019/04/10 15:06 編集
2019/04/10 15:26 編集
2019/04/10 15:05
2019/04/10 15:17
2019/04/10 15:20
2019/04/10 15:23 編集
2019/04/10 15:21
2019/04/10 15:27 編集
2019/04/11 14:32
2019/04/12 01:47
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。