1

我目前正在从事一个需要我存储 32 位模式并对其进行分析的项目。我需要一种方法将诸如“1001 1001 1100 1000”之类的模式存储在一个变量中,例如,它不会被重新解释为字符。

4

4 回答 4

2

在 C++03 中,我会使用unsigned intorunsigned long但两者均未指定为 32 位。被指定为至少unsigned long能够保存值 [0, 2 32 -1],因此理论上它可能大于 32 位。在 C++11 中,我会使用;uint32_t

例如0000 0000 0000 0000 1001 1001 1100 1000is 0x99c8,其中0x是十六进制前缀。

uint32_t bitpattern = 0x998c

如果变量bitpattern包含所需的位模式,并且您希望将其作为十六进制数字流式传输到控制台,则可以使用:

std::cout << std::hex << bitpattern;
于 2012-10-03T11:06:31.913 回答
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();
于 2012-10-03T11:34:02.257 回答
0

您确实意识到该模式不是 32 位的,对吧?

既然不是,就像

unsigned long pattern = 0x99c8;

应该是非常安全的,你很难找到一个unsigned long小于 16 位的平台。Lke Armen 说,如果你有uint32_t,请使用它。

于 2012-10-03T11:09:10.023 回答
0

除了尝试使用整数类型和位掩码来创建自己的系统之外,您可能还需要考虑一个很少使用的内置功能,即位字段。这种类型的定义很像结构,但是每个元素的数据类型是匿名的,大小由位数指定。有一些开销,但不会比你自己尝试实现的多;实际上,您让编译器完成工作。

如果您需要在整数类型(例如 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 位长。

于 2012-10-03T11:57:18.960 回答