C语言中关于位域的介绍

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。

为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域

来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:

struct 位域结构名

{ 位域列表 };

其中位域列表的形式为: 类型说明符 位域名:位域长度

struct WbitF {  unsigned int b0: 1;

unsigned char b0 :1;

unsigned char b1:1;

unsigned char b2:1;

unsigned char b3:1;

unsigned char b4:1;

unsigned char b5:1;

unsigned char b6:1;

unsigned char b7:1;

unsigned char b8:1;

unsigned char b9:1;

unsigned char b10:1;

unsigned char b11:1;

unsigned char b12:1;

unsigned char b13:1;

unsigned char b14:1;

unsigned char b15:1;

}

每个都占一位,若不够放存入下个字节中。1共占2个字节 :1是按位存储。

基本的成员变量就会被拆分!这个语法在初级编程中很少用到,但是在高级程序设计中不断地被用到!

例如:  struct student  {

unsigned int sex : 1;

unsigned int age : 15;

};

上述结构体中的两个成员 sex 和 age 加起来只占用了一个 unsigned int 的空间(假设 unsigned int 为 16 位)。  基本成员变量被拆分后,访问的方法仍然和访问没有拆分的情况是一样的,例如:  struct student sweek;  sweek.sex = MALE;// 这里的 MALE 只能是 0 或 1 ,值不能大于 1  sweek.age = 20;  虽然拆分基本成员变量在语法上是得到支持的,但是并不等于我们想怎么分就怎么分,例如下面的拆分显然是不合理的:  struct
student  {                    unsigned int sex : 1;                  unsigned int age : 12;  };  这是因为 1+12 = 13 ,不能再组合成一个基本成员,不能组合成 char 、 int 或任何类型,这显然是不能 “ 自圆其说 ” 的。

keil中不支持二进制数据,如0b0101,这样编译器无法通过。在使用位域时,会过多的使用位操作,如& | << >>等操作。

关于字节和位域之间的转换,如下:

typedef struct {

u8 model_flag :2;

u8 fan_rank :2;

u8 windsweeper :1;

u8  :3;

}set_status

set_status set_info;

set_info = buff[1];//把一个字节赋给位域结构体

这里需要注意的是,结构体刚好设置为一个字节,可以容纳buff[1]这个字节。特别注意的是:位域结构体中的各个变量的分配时从该字节的低位开始的。若buff为0110 1010,那么model_flag为 10,fan_rank为 10,windsweeper为 0,未用的三个位是011。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-28 17:46:33

C语言中关于位域的介绍的相关文章

关于C语言中的位域

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可.为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称 为“位域”或“位段”. 所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作. 这样就可以把几个不同的对象用一个字节的二进制位域来表示. 一.位域的定义和位域变量的说明 位域定义与结构定义相仿,其形式为: struct 位域结

Oracle中的sql脚本语言中的循环语句介绍

--sql脚本语言的循环介绍:--1.goto循环点.declare  x number;begin  x:=0;--变量初始化:  <<repeat_loop>>--设置循环点.  x:=x+1;  dbms_output.put_line(x);--循环体  if x<9 then            --进入循环的条件.    goto repeat_loop;   --用goto关键字引导进入循环.    end if;end; --2.for循环. declare

C语言中位域操作

C语言中位域定义: 以结构体中定义申明变量的形式: 类型说明符 位域名:位域宽度 struct bit{ int a:4; // 申明位域变量a,占用4个bit位宽度 int b:4; // 申明位域变量b,占用4个bit位宽度 int c:4; // 申明位域变量c,占用4个bit位宽度 }; 在gcc编译器中对结构体进行了默认的对齐操作,以下的所有的现象都是基于gcc的编译条 件:1):申明的两个相连的位域变量占位一般都是紧密连接的,例如上面的a和b,或者是b和 c:a占用起始字节的低4位,

C语言中的位段(位域)

位段(bit-field)是以位为单位来定义结构体(或联合体)中的成员变量所占的空间.含有位段的结构体(联合体)称为位段结构.采用位段结构既能够节省空间,又方便于操作. 位段的定义格式为: type  [var]: digits 其中type只能为int,unsigned int,signed int三种类型(int型能不能表示负数视编译器而定,比如VC中int就默认是signed int,能够表示负数).位段名称var是可选参数,即可以省略.digits表示该位段所占的二进制位数. 一.位段的

C语言中内存的管理

一  Handler作用和概念 包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙. 1.运行在某个线程上,共享线程的消息队列: 2.接收消息.调度消息,派发消息和处理消息: 3.实现消息的异步处理: Handler能够让你发送和处理消息,以及Runnable对象:每个Handler对象对应一个Thread和Thread的消息队列.当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以传递消息和runnable对象到消息队列中,执行消息

魏兆辉的IOS基础学习笔记之十一 OC语言基础-06 Foundation框架介绍

在之前的博文中,我们创建的项目文件的时候,默认都有引用#import <Foundation/foundation.h> 这个头文件.但是,之前我们对Foundation都没有展开介绍.这篇博文,我们就揭开它神秘的面纱. 之前,我们有提到过OC使用的是Cocoa框架.那么Cocoa和Foundation之间,有啥关联呢?实际上,Cocoa是由许多个不同的框架组成的.最常用的是Foundation和Application Kit. Foundation框架中有很多有用的.面向数据的简单类和数据类

初解,Scala语言中基于Actor的并发编程的机制,并展示了在Spark中基于Scala语言的Actor而产生的消息驱动框架Akka的使用,

Scala深入浅出实战中级--进阶经典(第66讲:Scala并发编程实战初体验及其在Spark源码中应用解析)内容介绍和视频链接 2015-07-24 DT大数据梦工厂 从明天起,做一个勤奋的人 看视频.下视频,分享视频 DT大数据梦工厂-Scala深入浅出实战中级--进阶经典:第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析 本期视频通过代码实战详解了Java语言基于加锁的并发编程模型的弊端以及Scala语言中基于Actor的并发编程的机制,并展示了在Spark中基于Sc

Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

Coursera-Getting and Cleaning Data-Week4 Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周课程主要针对text进行处理.里面包括 1.变量名的处理 2.正则表达式 3.日期处理(参见swirl lubridate包练习) 首先,变量名的处理,奉行两个原则,1)统一大小写tolower/toupper:2)去掉在导入数据时,因为特殊字符导致的合并变量 3)不要重复:4)少用代码缩写 使用的函数包括 替换查找:

C语言中随机数相关问题

用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand(unsigned int seed); //为rand设置"种子"的值 srand()就是给rand()提供种子seed,如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的.通常的做法是以这样一句代码: srand((unsigned)time(NULL)); 来取