1.首先回忆结构体

我们都知道定义一个结构体可以这样的方式定义:

struct Point {
float x;
float y;
} point; //等价于: struct Point point;

除此之外,如果不想声明结构体,只想定义结构体的话,还可以这样:

struct  {
float x;
float y;
} point; //等价于: struct Point point;

2.位域之简单应用

做低层时,经常会读写寄存器,比如操作某位,设置为0或1,而在C语言中便为我们提供一种数据结构”位域”,使得我们通过读写”位域”来实现操作某位.

例如一个常见的位域的结构体,操作如下所示:

#include <stdio.h>

struct {
unsigned mode:; //bit[0,7]:模式选择
unsigned en:; //bit[8] :使能选择
unsigned reserved:; //bit[9] :保留reserved (也可以写成unsigned reserved:1;)
unsigned clk_select:; //bit[10,13]:时钟选择
unsigned ch_select:; //bit[14,15]:通道选择
}reg11; //定义一个reg11变量,不声明结构体的好处在于确保变量唯一性 int main()
{
reg11.en =; //bit8=1 --> 256
printf("reg11=%d\n",reg11); //打印 256 reg11.mode =;
printf("reg11=%d\n",reg11); //打印 256+50
return ;
}

打印:

3.位域之越界处理

比如,我们定义的某个位域只有固定1位,如果向该位写入超过1位的值.会自动保留最低1位.

示例:

#include <stdio.h>
struct {
unsigned mode:; //bit[0,7]:模式选择
unsigned en:; //bit[8] :使能选择
unsigned reserved:; //bit[9] :保留reserved(也可以写成unsigned reserved:1;)
unsigned clk_select:; //bit[10,13]:时钟选择
unsigned ch_select:; //bit[14,15]:通道选择
}reg11; //定义一个reg11变量,不声明结构体的好处在于确保变量唯一性 int main()
{
reg11.en =; //bit8=1 --> 256
printf("1st:reg11=%d\n",reg11); //打印 256 reg11.en =; //5(b'101) 保留低1位: b'1
printf("2st:reg11=%d\n",reg11); //打印 256 reg11.en =; //5(b'110) 保留低1位: b'0
printf("3st:reg11=%d\n",reg11); //打印 0 return ;
}

打印:

4.注意, 使用位域的结构体的长度默认最小值为int型(4字节),如果超过4字节(32位),则会是64

示例:

#include <stdio.h>

struct {
unsigned a:;
unsigned b:;
unsigned c:;
}reg1;        //位域总长度只有7位 struct reg{
unsigned a:;
unsigned b:;
unsigned c:;
}reg2; int main()
{
printf("%d\n",sizeof(reg1));
printf("%d\n",sizeof(reg2));
return ;
}

打印:

5.如果某个寄存器只有8位(1字节),该如何使用位域处理?

方法1-使用union联合体,使各字段共享一块内存,通过读写union结构体里的char变量即可.

示例:

#include <stdio.h>

typedef union{
unsigned char val; struct {
unsigned a:;
unsigned b:;
unsigned c:;
unsigned d:;
}bit; }reg11; //使用typedef ,告诉编译器,reg11是个声明类型 int main()
{
reg11 reg;
   reg.val=;
reg.bit.b = ; //bit[4]=1
printf("val = %d\n",reg.val); return ;
}

打印:

 方法2-直接定义为unsigned char

示例:

struct reg{
unsigned char a:;
unsigned char b:;
unsigned char c:;
}; //位域总长度只有7位 int main()
{
printf("%d\n",sizeof(reg));
return ;
}

打印:

6.如果想定义并初始化

示例:

typedef struct {
unsigned OVL :;
unsigned OVOLCN :;
}rg11;
rg11 reg = {,}; //初始化reg变量 OVL=57 OVOLCN=1

最新文章

  1. CSS Hack技术介绍及常用的Hack技巧集锦
  2. Autofac - 程序集扫描
  3. C#高级编程笔记 Day 4, 2016年9月 12日(接口)
  4. 【转】Drawable /Bitmap、String/InputStream、Bitmap/byte[]
  5. 打造 html5 文件上传组件,实现进度显示及拖拽上传,支持秒传+分片上传+断点续传,兼容IE6+及其它标准浏览器
  6. Beta版本冲刺Day3
  7. 关于js判断鼠标移入元素的方向--解释
  8. Linux驱动设计编译错误信息集锦
  9. Android开发之PendingIntent的使用
  10. ajax 小案例
  11. 处女作《Web全栈开发进阶之路》出版了!
  12. 非旋 treap 结构体数组版(无指针)详解,有图有真相
  13. MVC模式笔记
  14. Boruvka算法求最小生成树
  15. JSP(3)—Cookie和Session
  16. linux分区划分
  17. [转]KMP算法理解及java实现
  18. 启动secondarynamenode时报错
  19. POJ3045 Cow Acrobats
  20. C命令行参数

热门文章

  1. git无法同步
  2. Python之旅Day15 Bootstrap与Django初识
  3. SQL Server 深入解析索引存储(聚集索引)
  4. Android JNI 学习(五):References Api
  5. redis订阅关闭异常解决
  6. dubbo实用知识点总结(二)
  7. [部署]CentOS安装PHP环境
  8. java中的http请求的封装(GET、POST、form表单形式)
  9. LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium
  10. SVN切换账号