- ベストアンサー
配列のビット設定方法
以下のようにビットを設定する場合、どのようにすればよいのでしょうか? 効率よく設定したいのですが・・・。 // bit // 23 - 21:week1 // 20 - 18:week2 // 17 - 15:week3 // 14 - 12:week4 // 11 - 9:week5 // 8 - 6:week6 // 5 - 3:week7 // 2 - 0:week8 unsigned char week[3]; 上記の変数にこの変数の内容を設定する // 以下の変数の範囲は 0~7 unsigned char week1; unsigned char week2; unsigned char week3; unsigned char week4; unsigned char week5; unsigned char week6; unsigned char week7; unsigned char week8; ---------------- week[0] = ( week1 << 5 ) & ( week2 << 2 ) & ( week3 >> 1 ) ・ ・ ・ 上記のような感じで設定できると思うのですが、もっと効率的に方法はないでしょうか? 配列の数が多くなると面倒ですので。。。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★共用体を使うのはどう。 ・基本的なことは回答者 No.1 さんと同じで『ビットフィールド』を使います。 下にそのサンプルを載せます。 サンプル: union { struct { unsigned int week1 : 3; unsigned int week2 : 3; unsigned int week3 : 3; unsigned int week4 : 3; unsigned int week5 : 3; unsigned int week6 : 3; unsigned int week7 : 3; unsigned int week8 : 3; } x; unsigned long week; } data; // 一括の場合 data.week = 011234567; ←8進数で設定 // 個別の場合 data.x.week1 => 7(1) data.x.week2 => 6(1) data.x.week3 => 5(2) data.x.week4 => 4(3) data.x.week5 => 3(4) data.x.week6 => 2(5) data.x.week7 => 1(6) data.x.week8 => 1(7) ※処理系により、バイトオーダーが異なります。 リトルエンディアン、ビッグエンディアンの2つがあります。注意!
その他の回答 (1)
- 1839cc
- ベストアンサー率54% (12/22)
BITフィールドを用いればよいのでは? BITの並び順が重要であれば、処理系依存になるため 注意が必要です。 struct { unsigned int week1 : 3; unsigned int week2 : 3; unsigned int week3 : 3; unsigned int week4 : 3; unsigned int week5 : 3; unsigned int week6 : 3; unsigned int week7 : 3; unsigned int week8 : 3; }; あとは、マクロ関数やC++のクラスを自作する手が思い浮かびます。
お礼
回答ありがとうございました。
お礼
サンプルを載せていただきありがとうございます。 参考にさせていただきます。