如何使用大于64位的位域
How to work with bitfields longer than 64 bits?
问题说明一切
如果我有一个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位边界。
如果你的动机是让你的访问"尽可能快",那么在试图比编译器更聪明之前要三思。如今,它们可以在你没有意识到的情况下进行优化。我最好的建议是:保持你的代码易于阅读和理解。
相关文章:
- qmake:检测目标位宽(32 位或 64 位)
- 浮点数为 32 位和 64 位二进制表示形式
- 在node-gip binding.gyp文件中,如何根据系统结构(32位、64位)包含不同的库文件
- EDSDK 3.6 macOS - 32 位与 64 位和链接错误
- 32位到64位:LNK2019错误,如何检索相关信息
- 在QtMultimedia的QAudioFormat中为24位,32位和64位音频选择哪种样本类型(而不是大小)?
- C/C++ 在 32 位和 64 位计算机上可执行
- C++ 对 32 位和 64 位处理器强制对齐的安全性
- sizeof() 在 32 位和 64 位进程之间的行为不同
- 将32位和64位应用程序(具有相同代码)编译为一个EXE
- 32 位和 64 位的结构大小不同
- 我们是否需要担心 32 位或 64 位整数,或者我们只使用 'int'
- 为什么 32 位和 64 位系统上的"alignment"相同?
- 为MSVC建造GTEST:32位或64位
- 将Windows上32位和64位的Boost构建到同一文件夹中
- boost::OSX 上 32 位和 64 位程序之间共享内存中的进程间同步机制(互斥体、条件)
- Visual Studio - C++ - 以 32 位或 64 位构建和运行应用程序 - 从适当的程序文件目录加载 D
- 如何解决GMP的32位和64位库之间的冲突
- 在 32 位和 64 位程序中使用 std::chrono::d uration::rep 和 printf
- 32 位和 64 位系统之间的通信