• ベストアンサー

配列のビット設定方法

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

noname#254206
noname#254206

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

  • ベストアンサー
  • 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

  • ビット操作

     「ビット操作を用いて素数を調べたい」です。  unsigned 型の配列bit[16]を用いてビット操作によって素数を調べたいのですが、  例えば、bit[0]からbit[1]への移動方法?を教えてください。

  • 8個のビットを1バイトとして扱う方法

    1バイトをビット扱いする方法は、 union un_p1dr { unsigned char one_byte ; struct { unsigned char b7:1 ; unsigned char b6:1 ; unsigned char b5:1 ; unsigned char b4:1 ; unsigned char b3:1 ; unsigned char b2:1 ; unsigned char b1:1 ; unsigned char b0:1 ; } bit ; } ; #define pt_da_p1dr (*(volatile union un_p1dr *)0xffffd0) と宣言すれば、pt_da_p1dr.bit.b7 = 1 ;の様にビット扱いが出来ます。 この反対を行える宣言方法は、あるでしょうか? つまり、任意の1ビットを8ビット集め、プログラムでバイトにてアクセスしたいのですが・・・・ ARMなどは、ビットの扱いが容易に可能です。しかし、CPUの周辺関係事情より、バイトでのアクセスが 可能なように、ハード割り当てが出来ません。 従って、現在は、プログラムにて、ビットを集め、バイトにして、アクセスしています。 なにか良い宣言方法があれば、ご伝授していただけないでしょうか? 宜しくお願いいたします。

  • ビット演算について

    いつもお世話になります。 ビット演算について教えて下さい。 unsigned char buf1[1]=0x5a unsigned char buf1[2]=0x04 unsigned char buf1[3]=0x38 5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか? 2進数表記では、 5A | 04 | 38 01011010 | 00000100 | 00111000 12ビットずつとは、 010110100000 010000111000 と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか? また、0x5Aなどの16進数を2進数のビットで考えるときに、 01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか? 上記2点、どうぞよろしくお願い致します。

  • 1ビットごとの配列を作りたい

    例えばchar型で 5 0 4 という3つの数値があった時、 1 00000101  0  1 00000100 という配列にしたいのですが (5と4の前の1は「次は8ビット読む」という印。空白は見やすくするための物) ネットで調べてもよく分かりませんでした。 教えていただきたいのは、 ・ある構造体、配列などから上記のようなビット配列にする方法 ・ビット配列から通常の値にする方法 ・ビット配列のサイズ取得方法 です よろしくお願いします

  • C言語で確保できるビットの桁数

    C言語でビット単位でデータ操作する際に、確保できるビットの桁数はたとえば以下のような例の場合 unsigned char bit; 1バイト(=8ビット)なので8桁ということは勉強しました。 ここで、たとえば計算でビットの桁数を100桁用意したい場合 以下のように32*4桁という風に分ける方法しかないのでしょうか? unsigned int bit[4]; できれば一つの変数で済ませたいのですが、何か良い方法をご存知の方いらっしゃいましたらよろしくお願いします。

  • VC++6.0でC言語の基本データ型のビット長と範囲をしりたいです

    VC++6.0を使用しています。コマンドラインを使い勉強しているのですが、基本データ型のビット長と使える数の範囲を知りたいです。 たとえば、int型だと32ビットで-32767から32767の範囲の数を扱えるとかを知りたいです。コマンドライン上から調べることはできないのでしょうか? ネットでも書いてあるところがあるならいいのですが、できれば自分の手で調べる方法を見つけたいのです。 ちなみに char, unsigned char, int, unsigned int, short int, unsigned short int, long int unsigned long int, float, double, long doubleなどが知りたいです。 方法を知っている方教えてください。よろしくお願いします。

  • C言語の配列のサイズ

    二次元配列、三次元配列のサイズが知りたいです。 unsigned char test1[100]; は sizeof( test1 )で100ですが、 unsigned char test1[100][30]; はどのように書いたら100または、30なのか知りたいです。 unsigned char test1[100][30][5]; これも100,30,5のサイズをそれぞれ得る方法が知りたいです。 因みに以下のような数値なし[]を見たことがあるのですが どういう意味でしょうか? unsigned char test1[][30]; サイズを理解していないのは、ポインタを理解していないと同じことでしょうか?今更ながら自分自身が不安です。

  • 【C++】巨大なビット配列の用意の仕方

    現在C++で数値計算用のプログラムを組んでいます。 その計算の中で、2^16個の「on」または「off」のデータをメモリに記憶させる必要があります。その一つ一つにわざわざintやshortなどの既存のデータ型を使うのは馬鹿らしいので、2^16桁の二進数列(=8.2KB程度)を用意して操作したいと思っています。 (もし仮にon=+1,off=0などとしてint型配列を使うと、262KB必要となり、いくつも宣言することがためらわれます。この2^16個のデータを収める「配列」は全部で8000個程度用意したいのです。) これだけ大きなビット配列を、C++で用意するにはどうしたらよいでしょうか? 試しにビットフィールドを用いて struct bit{ unsigned elm :1<<16;  //2^16個のビット数列 }; と宣言してみたのですが、基本型のビット数を超えるからとコンパイルは通りませんでした。@VC++ リソースを活用するためにビット配列を扱った経験のある方など、どうかご教授よろしくお願いします。

  • C言語のビットフィールドについて

    はじめまして,今C言語を勉強中なのですが, ビットフィールドの宣言について質問があります。 勉強に使用しているテキストでは, ビットフィールドの宣言にはunsigned int型を使用すると書かれています(下記例参照)。 ここで質問は,unsigned charなどの型は推奨されない理由があるのか,ということです。 実際にunsigned char型で実行してもプログラムは動きますし,そちらのほうが語長も短くて済むのでいいような気がします。 テキストの書き方だと,他の型について言及していなかったので,なにか理由かあるのか,それとも特に問題ないのか,疑問に思っています。 わかる方いましたら,回答いただけると嬉しいです。 (ex) struct{ unsigned int bit0:1; unsigned int bit1:1; : unsigned int bit7:1; }bits;

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

専門家に質問してみよう