現在、32 ビット パターンを保存して分析する必要があるプロジェクトに取り組んでいます。たとえば、「1001 1001 1100 1000」などのパターンを char として再解釈されない変数に格納する方法が必要です。
4 に答える
C ++ 03では、unsigned int
またはを使用しますunsigned long
が、どちらも正確に32ビットに指定されていません。は、少なくとも値[0、2 32unsigned long
-1]を保持できるように指定されているため、理論的には32ビットより大きくなる可能性があります。C ++ 11では、;を使用します。uint32_t
たとえば、0000 0000 0000 0000 1001 1001 1100 1000
は0x99c8
、です。ここ0x
で、は16進プレフィックスです。
uint32_t bitpattern = 0x998c
変数bitpattern
に目的のビットパターンが含まれていて、それを16進数としてコンソールにストリーミングする場合は、次を使用します。
std::cout << std::hex << bitpattern;
32 ビット パターンを int に変換する場合は、STL コンテナー<bitset>
を使用してジョブを実行することもできます。
std::bitset<32> bit(std::string("0001100111001000"));
long unsigned bit_number = bit.to_ulong();
std::string bit_string = bit.to_string();
パターンが 32 ビットではないことに気付きましたよね?
そうではないので、次のようなものです
unsigned long pattern = 0x99c8;
unsigned long
16 ビット未満のプラットフォームを見つけるのは難しいでしょう。Lke Armen は、持っている場合uint32_t
はそれを使用すると言いました。
独自のシステムを作成するために整数型とビットマスキングを使用することに加えて、ビット フィールドという組み込みのめったに使用されない機能を検討することもできます。このような型の定義は構造体によく似ていますが、各要素のデータ型は匿名であり、サイズはビット数で指定されます。多少のオーバーヘッドはありますが、自分で実装しようとするよりもはるかに多くはありません。実際には、コンパイラに作業を任せます。
構造体を整数型 (long など) の間で前後に変換する必要がある場合は、reinterpret_cast を (ab) 使用するだけです。
struct bitSet {
bitSet(long in1) { //ctor, eg bitSet tmpBit(input);
*this = reinterpret_cast<bitSet>(in1);
}
long toLong() { //eg output=tmpBit.toLong;
return reinterpret_cast<long>(*this);
}
unsigned U0 : 4;
unsigned U1 : 4;
unsigned U2 : 4;
unsigned U3 : 4;
unsigned U4 : 4;
unsigned U5 : 4;
unsigned U6 : 4;
unsigned U7 : 4;
};
これの利点は、整数型の長さを保証することはできませんが、これにより、各要素の長さが 4 ビットのみであることを保証できることです。