位域操作

typedef  struct

    uint32_t    one:1
    uint32_t    two:2
    uint32_t    eight:8 
    uint32_t    :15
    uint32_t    twenty_five:10;  
}myarea;
位域操作,字面上可以看出就是进行位操作,也就是对几个字节中的bit进行赋值,这个主要作用就是可以更好利用存储空间,方便位操作
有一点要注意就上面我们定义的是32位的,所以后面的最大位操作最大也不能超过32
下面就分析一下上面的例子
one占1个bit
two占紧跟后2个bit
eight占8个
接下来无位名,代表填充15个bit不使用
赋值操作,例如想操作第一个bit
就这么写 myarea.one=1/0

C语言共同体
typedef union

    uint8_t:   name;
    uint16_t: age;
    uint32_t:class;
}myunion;
共同体就是类型变量共用一段存储空间,空间大小以里面变量最大的存储空间为准
上面这个例子中就是class那个变量,所以该共同体占用的大小就为4个字节,特别需要注意就是共同体中变量同时只有一个可以有效。也就是你要操作,也只能一个变量的操作。

下面将共同体和上面的位域操作结合起来看一个例子

typedef  struct
{ 
   union PA

       uint32_t:all;
       struct all_b
    {
          uint32_t    one:1
          uint32_t    two:2
          uint32_t    eight:8 
         uint32_t    :15
         uint32_t    twenty_five:10;  
      };

union PB

       uint32_t:all;
       struct
    {
          uint32_t    one:1
          uint32_t    two:2
          uint32_t    eight:8 
         uint32_t    :15
         uint32_t    twenty_five:10;  
      };
}newarea;
这个例子讲之前先说下这个例子来由,我们知道单片机,比方说那32位单片机来说好了,它的寄存器大多是32位的,有时候我们需要配置相应的位进行操作(位域操作),有时候我们又为了方便干脆对整个寄存器赋值,为了这两个赋值区分开来,也就是不要同时赋值,又为了共享存储空间(union),这时我们就把union和位域操作结合在了一起。
下面落实到我们应用上来,比如我得给单片机那个one位赋值:
#define       PA0_BaseAddr    0x40000000
#define       GPIO(*newarea)PA0_BaseAddr
操作PA端口寄存器某一位
GPIO->PA.all_b->one=0/1

posted @   idea~  阅读(359)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· Ai满嘴顺口溜,想考研?浪费我几个小时
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
点击右上角即可分享
微信分享提示