共用体(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分の左右シフト(掛け算・割り算)が自動で行えることになります。
いちいち処理しなくてすむので便利です。
コメント