• ベストアンサー

配列のビット設定方法

以下のようにビットを設定する場合、どのようにすればよいのでしょうか? 効率よく設定したいのですが・・・。 // 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 )  ・ ・ ・ 上記のような感じで設定できると思うのですが、もっと効率的に方法はないでしょうか? 配列の数が多くなると面倒ですので。。。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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つがあります。注意!

noname#254206
質問者

お礼

サンプルを載せていただきありがとうございます。 参考にさせていただきます。

その他の回答 (1)

  • 1839cc
  • ベストアンサー率54% (12/22)
回答No.1

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++のクラスを自作する手が思い浮かびます。

noname#254206
質問者

お礼

回答ありがとうございました。

関連するQ&A