如何使用大于64位的位域

How to work with bitfields longer than 64 bits?

本文关键字:位域 64位 大于 何使用      更新时间:2023-10-16

问题说明一切

如果我有一个96位字段:

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

考虑到其中的子字段可能位于32位边界上,我如何最好地访问它?一个从29位到35位的字段?

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

STL包含一个处理任意长度位域的类:

#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;
  }
}

[这个答案对C有效(扩展到c++)。]

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

因此,要使您的字段从29到35(包括):

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

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

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

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

如果你的动机是让你的访问"尽可能快",那么在试图比编译器更聪明之前要三思。如今,它们可以在你没有意识到的情况下进行优化。我最好的建议是:保持你的代码易于阅读和理解。