我目前正在开展一个项目,要求我存储32位模式并对其进行分析。我需要一种方法来存储模式,如“1001 1001 1100 1000”在一个变量中,例如它不会被重新解释为char。
答案 0 :(得分:2)
在C ++ 03中,我会使用unsigned int
或unsigned long
,但两者都没有指定为32位。 unsigned long
被指定能够保存至少值[0,2 32 -1],因此理论上它可能大于32位。在C ++ 11中,我使用uint32_t
;
例如0000 0000 0000 0000 1001 1001 1100 1000
是0x99c8
,其中0x
是十六进制前缀。
uint32_t bitpattern = 0x998c
如果变量bitpattern
包含所需的位模式,并且您希望将其作为十六进制数字流式传输到控制台,则可以使用:
std::cout << std::hex << bitpattern;
答案 1 :(得分:1)
如果要将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();
答案 2 :(得分:0)
你确实意识到模式不是32位,对吗?
因为它不是,像
unsigned long pattern = 0x99c8;
应该非常安全,你很难找到unsigned long
小于16位的平台。 Lke Armen说,如果你有uint32_t
,请使用它。
答案 3 :(得分:0)
除了尝试使用整数类型和位掩码来创建自己的系统之外,您可能还需要考虑内置的很少使用的功能,即bit fields。这种类型的定义很像结构,但每个元素的数据类型是匿名的,大小由位数指定。有一些开销,但不会超过你自己试图实现它;实际上,你让编译器完成工作。
如果需要在整数类型(例如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;
};
这样做的好处是虽然你不能保证整数类型的长度,如此长,这确保每个元素只有4位长。