问题说明了一切。
如果我有一个96位字段:
uint32_t flags[3]; //(thanks @jalf!)
鉴于我的子域可能位于32位边界(例如,从第29位到第35位的字段),我如何最好地访问它?
我需要尽可能快地访问,所以我宁愿不将它们作为数组的32位元素进行迭代。
[这个答案对C有效(对于C ++也是如此)。]
与平台无关的方法是适当地应用位掩码和位移。
所以要让你的领域从29到35(含):
(flags[1] & 0xF) << 3 | (flags[0] & 0xE0000000) >> 29 // The bitmask here isn't really needed, but I like symmetry!
显然,您可以编写一个类/函数/宏来自动执行此操作。
STL包含一个用于处理仲裁长度的位域的类:
#include 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; } }
位域超过64位没有问题。 它们甚至可能比你的大得多!
我看到的问题是,您正在访问跨越32位边界的成员。 这更是一个问题。 但说实话,在64位平台上,如果你使用long long
来创建你的位域类型,那么你只需要注意64位边界。
如果你的动机是“尽可能快地”访问,那么在尝试比编译器更聪明之前要三思而后行。 如今,他们可以优化,因为你甚至都不知道。 我最好的重新定位:让您的代码易于阅读和理解。
以上就是c/c++开发分享如何处理超过64位的位域?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560197.html