C/C++ 结构体中位字段的使用

结构体中的位字段的类型为整形,接下来是冒号,冒号后面是一个数字,它指定使用的位数,可以使用
没有名称的字段来提供间距。每个成员都被称为位字段,位字段通过一个结构声明来建立,该结构声明
每个字段提供标签,并确定该字段的宽度。
如: 
    struct Data1
    {
        unsigned int bit0 : 1;
        unsigned int bit1 : 3;
        unsigned int bit2 : 6;
        unsigned int bit3 : 22;
    };
    其中bit0占了1个位;
        bit1占了3个位;
        bit2占了6个位;
        bit3占了22个位;
    实际上这个结构体的大小是四个字节32位的长度,也就是1个in类型的长度

示例源码:

// Len_StructBit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

#include <fstream>
struct Data1
{
    unsigned int bit0 : 1;
    unsigned int bit1 : 3;
    unsigned int bit2 : 6;
    unsigned int bit3 : 22;
};

struct Data2
{
    unsigned int bit0 : 1;
    unsigned int bit1 : 3;
    unsigned int bit2 : 6;
    unsigned int bit3 : 23;
};

int main()
{
    std::cout << "\n\tData1=" << sizeof(Data1) << endl;
    std::cout << "\n\tData2=" << sizeof(Data2) << endl;  
}

结果分析:


结构体中位字段值可单独读出,也可组合到int类型中。
位字段单独读出的时候,要注意其占的位的个数。
组合到int类型中的时候要注意组合是的移位操作。

示例源码:

// Len_StructBit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

#include <fstream>
struct Data1
{
    unsigned int bit0 : 1;
    unsigned int bit1 : 3;
    unsigned int bit2 : 6;
    unsigned int bit3 : 22;
};

int main()
{
    Data1 d1;
    d1.bit0 = 0x1;
    d1.bit1 = 0x4;
    d1.bit2 = 0x21;
    d1.bit3 = 0x200001;

    unsigned int uData = 0;
    uData = uData | (d1.bit0 << 31);
    uData = uData | (d1.bit1 << 28);
    uData = uData | (d1.bit2 << 22);
    uData = uData | (d1.bit3);

    cout << hex << "uData=" << uData << endl;
}

执行结果

结构体中的位字段的赋值。
结构体中的位字段可以单独赋值,但是赋值不能大于位字段的大小,否则多出的高位无效。
也可以从整数中,提取相应的位。
示例源码:

// Len_StructBit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

#include <fstream>
struct Data1
{
    unsigned int bit0 : 1;
    unsigned int bit1 : 3;
    unsigned int bit2 : 6;
    unsigned int bit3 : 22;
};

int main()
{  
    unsigned int uSrcData = 0x12345678;

    cout << hex << "\n\nuSrcData = 0x" << uSrcData << endl;
    Data1 d2;
    d2.bit0 = uSrcData >> 31;
    d2.bit1 = (uSrcData >> 28);
    d2.bit2 = (uSrcData >> 22);
    d2.bit3 = (uSrcData);

    cout << hex << "bit0 = 0x" << d2.bit0 << endl;
    cout << hex << "bit1 = 0x" << d2.bit1 << endl;
    cout << hex << "bit2 = 0x" << d2.bit2 << endl;
    cout << hex << "bit3 = 0x" << d2.bit3 << endl;

}

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WendyWJGu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值