C语言小碎片七
来源:互联网 发布:java io读取文件 编辑:程序博客网 时间:2024/04/30 14:07
C语言中的位域结构体
一、什么是位域结构体?
在数据表达的过程中,有的时候我们并不需要一个完整的字节来表示,例如在表示二逻辑状态数据的时候我们只需要一个二进制位(0、1)就能够很好的表达出来。同样的出于节省空间或者精简数据,减小数据大小,以提高数据传输速度等因素的考虑,C语言提供了一种称为位域(位段)的数据结构。在位域(位段)结构中,把一个字节中的二进位划分为几多个不同的区域,并对每个区域的位数加以说明(即给每个域提供一个域名,也可缺省),使得在程序中可以按域名对数据进行操作。
二、位域结构体如何定义?
位域(位段)定义的格式与结构体的定义格式相类似:
struct 位域结构名 { 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:
struct{unsigned int: 1;// bit_0 位域名缺省, 无名位域unsigned int bit_1 : 1;// bit_ 位定义域名为 bit_1unsigned int bit_2 : 1; unsigned int bit_3 : 2;unsigned int bit_5 : 1;unsigned int bit_6 : 1; unsigned int bit_7 : 1;} OneByte;// 一个字节共8位
三、定义位域结构体时需要注意的问题
1、一个位域必须存储在同一个字节中,不能跨两个字节存储。如果一个字节所剩空间不够存放另一位域时,剩余的空间应该使用空域填充或无名位域填充,声明不使用,然后从下一单元开始存放这个位域。例如:
struct { unsigned a:4 unsigned :0 /*空域,用于填充,声明本字节中剩余位不使用(空穴)*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4}TowByte;
2、一个位域的长度不能大于一个int的长度(32bit位)
3、一个位域可以不定义位域名,但此时它只能用来作填充或调整位置。无名位域是不能在程序中使用的。
四、位域变量的使用
位域变量的使用方式和结构成员的使用方式相同,其使用格式为:位域变量名·位域名位域变量指针->位域名而且位域变量是允许使用各种格式输出的。例如:
OneByte b_Byte, *p_Byte;b_Byte.bit_2= 0;p_Byte->bit_3= 1;b_Byte.bit_5= 1;p_Byte->bit_6= 0;p_Byte->bit_7= 1;printf("%d,%d,%d\n", b_Byte.bit_2, p_Byte->bit_3, b_Byte.bit_5, p_Byte->bit_6, p_Byte->bit_7);p_Byte->bit_3 &= 0;p_Byte->bit_5 |= 0;printf("%d,%d\n",p_Byte->bit_3, b_Byte.bit_5);
阅读全文
0 0
- C语言小碎片七
- C语言小碎片一
- C语言小碎片二
- C语言小碎片三
- C语言小碎片四
- C语言小碎片五
- C语言小碎片六
- C 碎片七 指针
- C语言知识碎片
- 知识碎片之C语言
- C语言小程序(七)、石头剪刀布
- 小碎片
- C语言(七)
- C语言(七)枚举
- 小程序(七)C语言 输入字符 检测后每个单词逆序输出
- C语言库函数(七)
- [C语言学习]作业七
- C语言学习笔记<七>
- Mysql怎么同步两个不同库的不同表以及部分字段
- linux小工具安装
- 打包生成桌台二维码
- 使用IDEA新建一个Spring Boot项目
- 在Qt中移植VPU编解码程序时遇到的问题
- C语言小碎片七
- python enumerate
- 全选全不选批量删除
- linux命令:文件搜索(locate、whereis、which、find、grep)
- Android加载WebView避免页面空白
- 智能照明灯具认证相关标准介绍
- 源码分析之-容器类-HashMap
- Sharding-JDBC使用问题记录
- python加密->RC4.py