共用体(union)の使い道

Pocket

 

 共用体(union)を使ってみました。いまいち使いどころが分からなかったのですが、今回、bitシフトするときなどに便利なことに気づいて使ってみました。

 

 Arduinoなんかでセンサー値などを取得して処理する場合、私の場合はなるべく整数(int)で処理して最後に物理量にする、などをよく行います。(少しでも処理速度上げるため)

 

 その際、生値でそのまま計算していると精度が落ちてしまうため、100倍や1000倍などした値で処理して、物理量がほしいときに1/100や1/1000して元の量に戻したりしてました。

 

<スポンサーリンク>

 ただ共用体(union)使えばこういったことが簡単に行えます。例えば、

typedef union {
  int32_t B32[3];
  int16_t B16[6];
} TYPE;

TYPE V = {0, 0, 4096 * 65536};

 こんな変数を共用体で準備します。今この状態では

V.B32[2] には 268435456 (4096*65536)
V.B16[5] には 4096

 が格納されてることになります。さらに例えば

V.B16[1] = 2;
と代入すれば
V.B32[0]には131072(2 * 65536)
が入ることになります。さらに
V.B32[0] = V.B32[0] * 3;
とすれば
V.B16[1]  6 となります。
計算の中身は131072*3 => 393216でこの値を65536で割った値(16bit右シフト)です。

 16bit分の左右シフト(掛け算・割り算)が自動で行えることになります。

 

 いちいち処理しなくてすむので便利です。

 

Pocket

<スポンサーリンク>


この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL