我目前正在从事一个需要我存储 32 位模式并对其进行分析的项目。我需要一种方法将诸如“1001 1001 1100 1000”之类的模式存储在一个变量中,例如,它不会被重新解释为字符。
4 回答
在 C++03 中,我会使用unsigned int
orunsigned long
但两者均未指定为 32 位。被指定为至少unsigned long
能够保存值 [0, 2 32 -1],因此理论上它可能大于 32 位。在 C++11 中,我会使用;uint32_t
例如0000 0000 0000 0000 1001 1001 1100 1000
is 0x99c8
,其中0x
是十六进制前缀。
uint32_t bitpattern = 0x998c
如果变量bitpattern
包含所需的位模式,并且您希望将其作为十六进制数字流式传输到控制台,则可以使用:
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)之间来回转换结构,您可以(ab)使用 reinterpret_cast:
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;
};
这样做的好处是,虽然你不能保证整数类型的长度,比如 long,但这确实保证了每个元素只有 4 位长。