你能直接从 C++ 中的位域中提取位掩码吗?
Can you extract bitmask directly from bitfield in C++?
考虑以下示例:
#include <iostream>
using namespace std;
struct Test
{
uint8_t A:1;
uint8_t B:1;
uint8_t C:1;
uint8_t D:1;
};
int main()
{
Test test;
test.A = 1;
test.B = 0;
test.C = 1;
test.D = 0;
int bitmask = test.A | (test.B << 1) | (test.C << 2) | (test.D << 3);
cout << "Size: " << sizeof(test) << ", bitmask: " << bitmask;
return 0;
}
我假设位域中的数据以某种方式表示为位掩码?我想知道是否有一种方法可以直接获取位掩码,而不必经过并转移所有成员。在这种情况下,这没什么大不了的,但如果你有大的位域,它会变得非常乏味。
例如,如果我能做这样的事情就好了:
int bitmask = (int)test;
当然不行。有什么方法可以达到类似的稳健性?
假设您要转换整个结构,并且存在一个与结构大小相同的整数类型:
Test test;
test.A = 1;
test.B = 0;
test.C = 1;
test.D = 0;
cout << (int)std::bit_cast<char>(test) << '\n';
std::bit_cast
是 C++20 的特性。
这里使用char
是因为它的大小与Test
相同。我将结果转换为 int
,否则 cout
会将结果数字解释为字符代码。
另一种解决方案是 memcpy
将结构(或其一部分)转换为整数:
char ch;
std::memcpy(&ch, &test, 1);
cout << (int)ch << '\n';
与 bit_cast
不同,这不需要现代编译器,并允许您检查结构的特定部分(假设该部分是字节对齐的)。
考虑以下示例:
#include <iostream>
using namespace std;
struct Test
{
uint8_t A:1;
uint8_t B:1;
uint8_t C:1;
uint8_t D:1;
};
int main()
{
Test test;
test.A = 1;
test.B = 0;
test.C = 1;
test.D = 0;
int bitmask = test.A | (test.B << 1) | (test.C << 2) | (test.D << 3);
cout << "Size: " << sizeof(test) << ", bitmask: " << bitmask;
return 0;
}
我假设位域中的数据以某种方式表示为位掩码?我想知道是否有一种方法可以直接获取位掩码,而不必经过并转移所有成员。在这种情况下,这没什么大不了的,但如果你有大的位域,它会变得非常乏味。
例如,如果我能做这样的事情就好了:
int bitmask = (int)test;
当然不行。有什么方法可以达到类似的稳健性?
假设您要转换整个结构,并且存在一个与结构大小相同的整数类型:
Test test;
test.A = 1;
test.B = 0;
test.C = 1;
test.D = 0;
cout << (int)std::bit_cast<char>(test) << '\n';
std::bit_cast
是 C++20 的特性。
char
是因为它的大小与Test
相同。我将结果转换为 int
,否则 cout
会将结果数字解释为字符代码。
另一种解决方案是 memcpy
将结构(或其一部分)转换为整数:
char ch;
std::memcpy(&ch, &test, 1);
cout << (int)ch << '\n';
与 bit_cast
不同,这不需要现代编译器,并允许您检查结构的特定部分(假设该部分是字节对齐的)。