C++

位域用法

Posted by DEVIN on Thu, Jul 13, 2023

如果有字段定义为int类型的话,那么符号位的判断需要特别注意。 例如:下面的 B::f2 字段是有符号类型,其符号位是f2的最高位,可以表示的范围是-64~63

 1#include <iostream>
 2
 3struct B {
 4    unsigned int f1:1;
 5    int f2:7;
 6};
 7
 8int main()
 9{
10    B b1 = {0, 10};
11    B b2 = {0, 127};
12
13    std::cout << std::boolalpha << (b1.f2 >= 0) << std::endl; // true
14    std::cout << std::boolalpha << (b2.f2 >= 0) << std::endl; // false
15}
 1#include <iostream>
 2#include <cstring>
 3using namespace std;
 4
 5struct Flags {
 6    uint32_t k1 : 1;
 7};
 8
 9struct AA {
10    // Flags flag : 1; // error: bit-field ‘flag’ with non-integral type ‘Flags’
11    Flags flag;
12    bool a1 : 1;
13    uint32_t a2 : 4;
14};
15
16int main()
17{
18    cout << sizeof (AA) << endl;
19
20    AA obj;
21    memset(&obj, 0, sizeof(AA));
22    obj.flag.k1 = 1;
23    obj.a1 = 1;
24    obj.a2 = 0b1111;
25
26    uint64_t val = *(uint64_t *)(&obj);
27    int len = sizeof(AA) * 8;
28    for (int i = 0; i < len; i++) {
29        cout << ((val >> (len - 1 - i)) & 0x01);
30    }
31}
32
33// output: 
34// 8
35// 0000000000000000000000000001111100000000000000000000000000000001