如何处理超过64位的位域?

时间:2011-11-15 15:34:36

标签: c++ c bit-manipulation bit-fields

问题说明了一切。

如果我有96位字段:

uint32_t flags[3]; //(thanks @jalf!)

如果我的子字段可能位于32位边界(例如,从第29位到第35位的字段),我如何最好地访问它?

我需要访问尽可能快,所以我宁愿不将它们作为数组的32位元素进行迭代。

3 个答案:

答案 0 :(得分:10)

STL包含一个用于处理bitfields of arbitary length的类:

#include <bitset>

int main() {
  const bitset<12> mask(2730ul); 
  cout << "mask =      " << mask << endl;

  bitset<12> x;

  cout << "Enter a 12-bit bitset in binary: " << flush;
  if (cin >> x) {
    cout << "x =        " << x << endl;
    cout << "As ulong:  " << x.to_ulong() << endl;
    cout << "And with mask: " << (x & mask) << endl;
    cout << "Or with mask:  " << (x | mask) << endl;
  }
}

答案 1 :(得分:6)

[这个答案对C有效(对于C ++也是如此)。]

与平台无关的方法是适当地应用位掩码和位移。

所以要让你的领域从29到35(包括):

  (flags[1] & 0xF)        << 3
| (flags[0] & 0xE0000000) >> 29  // The bitmask here isn't really needed, but I like symmetry!

显然,您可以编写一个类/函数/宏来自动执行此操作。

答案 2 :(得分:-1)

位域超过64位没有问题。它们甚至可能比你的大得多!

我看到的问题是,您正在访问跨越32位边界的成员。这更像是一个问题。但说实话,在64位平台上,如果使用long long创建位域类型,那么你只需要注意64位边界。

如果你的动机是“尽可能快地”进行访问,那么在尝试比编译器更聪明之前要三思而后行。如今,他们可以优化,因为你甚至都不知道。我最好的重新定位:让您的代码易于阅读和理解。