0から3までの値をデータ構造に格納できるはずです。したがって、2ビットが必要です。このデータ構造は素晴らしい2^16の場所になります。だから、私は2 ^ 16 * 2(ビット)が欲しいです。C + +では、メモリに正確に2ビットを使用しますか?
7 に答える
ユニットごとに2ビット(3ビットではない)が必要なので、4ユニットを1バイトに、または16ユニットを1つの32ビット整数にパックできます。
std::array<uint32_t, 4096>
したがって、 216単位の2ビット値に対応する必要があります。
次のようにn番目の値にアクセスします。
unsigned int get(std::size_t n, std::array<uint32_t, 4096> const & arr)
{
const uint32_t u = arr[n / 16];
return (u >> (2 * (n % 16))) & 0x3;
}
または、ビットフィールドを使用することもできます。
struct BF32 {
uint32_t u0 : 2;
uint32_t u1 : 2;
//...
uint32_t uF : 2;
}
そして、を作成しstd::array<BF32, 4096>
ます。
1バイト未満の単一のオブジェクトを割り当てることはできません(1バイトはシステム内でアドレス可能な最小単位であるため)。
ただし、ビットフィールドを使用して、構造体の一部を1バイトよりも小さくすることができます。これらの1つを作成して、8つの値を保持できます。このサイズは、正確に3バイトです。
#pragma pack(1) // MSVC requires this
struct three_by_eight {
unsigned value1 : 3;
unsigned value2 : 3;
unsigned value3 : 3;
unsigned value4 : 3;
unsigned value5 : 3;
unsigned value6 : 3;
unsigned value7 : 3;
unsigned value8 : 3;
}
__attribute__ ((packed)) // GCC requires this
;
これらは、...を使用してアクセスできないため、扱いにくい場合があります。と同様に機能するが、1ではなく3ビットで[]
機能する独自のクラスを作成するのが最善です。bitset
組み込みシステムで作業しておらず、リソースが十分である場合はstd::bitset<>
、プログラマーとしての仕事を容易にするものを確認できます。
ただし、組み込みシステムで作業している場合、ビットセットはおそらく適切ではありません(コンパイラはおそらくテンプレートさえサポートしていません)。ビットを操作するためのテクニックはたくさんあり、それぞれに独自の癖があります。ここにあなたを助けるかもしれない記事があります:
> http://www.atmel.com/dyn/resources/prod_documents/avr_3_04.pdf
0から3には4つの可能な値があります。log2(4)== 2であるため、または2 ^ 2 == 4であるため、3ビットではなく2ビットが必要です。
ビットフィールドを使用することをお勧めします
昨夜、ビットフィールド構造体に割り当てられたサイズについての議論がありました。構造体は1バイトより小さくすることはできません。ほとんどのマシンとコンパイラでは、コンパイラとワードサイズに応じて、2または4のいずれかになります。したがって、いいえ、3ビット構造体(実際に必要な2ビット)を取得することはできません。ただし、ビットを自分で、たとえばuint64_t
sの配列にパックすることはできます。または、16個の2ビットメンバーで構造体を作成し、gccがその4バイト構造体を作成するかどうかを確認してから、それらの配列を使用することもできます。
すでにいくつかのデータ構造がある場合は、いくつかのビットをこっそりと回すという非常に古いトリックがあります。これは非常に厄介であり、非常に正当な理由がない限り、それはおそらくまったく良い考えではありません。あなたが本当に2、3ビット節約する必要がある場合に備えて、私はこれを指摘しているだけです。
アラインメントにより、x86またはx64上のポインターは多くの場合4の倍数であるため、そのようなポインターの最下位2ビット(たとえば、へのポインターint
)は常に0
です。これを悪用して2ビットをそこに忍び込ませることはできますが、これらのポインターにアクセスするときは、必ずそれらを削除する必要があります(アーキテクチャによっては、ここではわかりません)。
繰り返しますが、これは厄介で危険でかなりのUBですが、おそらくあなたの場合はそれだけの価値があります。
3^5 = 243
8ビットで5つのエントリを収めることができます。この方法では、大量のデータを保存するために費やすスペースが20%少なくなります。必要なのは、2方向のルックアップと操作のためのルックアップテーブルです。