2

intプログラムを作成しているときに、多くの型変数が 10 を超えないことに気付きました。anintは最短で 2 バイト ( カウントする場合は 1 char) であるため、最大値 15 の 4 を short int に格納できるはずであり、 and を使用しunsigned intsてそれぞれに個別にアクセスできることがわかっています。>><<

short unsigned int SLWD = 11434;
S is (SLWD >> 12), L is ((SLWD << 4) >> 12),
W is ((SLWD << 8) >> 12), and D is ((SLWD << 8) >> 12)

ただし、これをクラスの関数に含める方法がわかりません。関数の型は type でGetVal()なければならず、intそもそもビットを分離するという目的が無効になるからです。

4

3 に答える 3

4

まず、最適化のルールを覚えておいてください。ただし、これはビットフィールドを使用する C または C++ で可能です。

struct mystruct {
    unsigned int smallint1 : 3; /* 3 bits wide, values  0 -- 7 */
    signed int   smallint2 : 4; /* 4 bits wide, values -8 -- 7 */
    unsigned int boolean   : 1; /* 1 bit  wide, values  0 -- 1 */
};

それほど多くのストレージを必要としないことで得をする一方で、すべてにアクセスするコストが高くなるため、失うことに注意してください。これは、読み取りまたは書き込みのたびに、それに関連付けられた多くのちょっとした調整メカニズムが関連付けられているためです。ストレージが安価であることを考えると、おそらくそれだけの価値はありません。

vector<bool>編集: 1 ビットの bool を格納するために使用することもできます。ただし、通常のように動作しないので注意してくださいvector。特に、反復子は提供されません。vector<bool>aが実際にはa ではないと言っても過言ではないほど十分に異なっていvectorます。Scott Meyers は、このトピックについて「Effective STL」で非常に明確に書いています。

于 2010-02-26T02:09:29.547 に答える
2

C では、スペースを節約するという唯一の目的で、unsigned short をビットフィールドを持つ構造体として再解釈できます(または、再解釈をいじらずにそのような構造体を使用します)。

#include <stdio.h>

typedef struct bf_
{
   unsigned  x : 4;
   unsigned  y : 4;
   unsigned  z : 4;
   unsigned  w : 4;
} bf;


int main(void)
{
   unsigned short i = 5;
   bf *bitfields = (bf *) &i;

   bitfields->w = 12;
   printf("%d\n", bitfields->x);
   // etc..

   return 0;
}
于 2010-02-26T02:11:03.400 に答える
1

それは非常に一般的なテクニックです。通常は、より大きなプリミティブ型 (int や long など) の配列を割り当て、マッピングを処理するための抽象化を行います。OO 言語を使用している場合は、実際に BitArray や SmartArray などを実際に定義し、インデックスを受け取る getVal() を実装することをお勧めします。重要なことは、内部表現の詳細を確実に非表示にすることです (たとえば、プラットフォーム間を移動する場合)。

そうは言っても、ほとんどの主流言語はすでにこの機能を利用できます。
ちょっとしたことだけが必要な場合は、WikiPediaに良いリストがあります。ビット以上が必要な場合でも、何かを見つけるか、同様のインターフェースを使用して自分で実装できます。 参考までに Java BitSetを見てください。

于 2010-02-26T02:02:16.927 に答える