位域

和许多计算机语言不同,C语言具备访问字节中位的内设机制,称为位域(bit-field),通过它可以访问单个的位。由于以下原因,这种特点很有价值:
    1、内存紧张时,可以把若干个布尔变量存入一个字节中;
    2、某些设备把编码信息传输到各个位;
    3、某些加密算法需要访问字节中的位。
    虽然这类任务可以通过位操作实现,但位域可以增加更多的代码结构化,也可能更高效。位域必须是许多的结构或联合(位域仅在结构内可用),它定义了以位计算的域长。位域定义的一般形式是:
    type name:length;
    这里,type指定位域的类型,length指定位域的位数,位域的类型必须是int、signed或unsigned(C99还允许位域是_BOOL类型,但编译器几乎对此做了扩展,允许其他类型的存在)。 
    例如,我们通过把时间描述成一种结构来开始,在该结构中,将时、分和秒都声明为结构位域:
    typedef struct
        {
        unsigned    seconds    : 5;    /*half seconds!*/
        unsigned    minutes     : 6;
        unsigned    hours        : 5;
        } TIME;
    如果我们使用类型TIME来声明我们的时间变量:
    TIME time;
    那么就可以把3个位域作为常规的结构成员进行引用,同时把提取和插入问题留给编译器处理。例如把时间13:34:18存储进我们打包的表示中,现在可以轻松通过3条简单的赋值语句来完成:
    time.hours=13;
    time.minutes=34;
    time.seconds=18/2;
    位域变量也有自已的限制:不能取位域变量的地址;不能构造数组位域;位域变量不能跨越整数边界。此外,编程时不可能了解不同机器中位域的顺序,这意味着位域变量引入了对机器的依赖。各种特定的实现可能会带来其他的限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值