位域全解析

所谓”位域“是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。   
       它实际上是C语言提供的一种数据结构。
使用位域的好处是:   
       1.有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。这样节省存储空间,而且处理简便。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
        2.可以很方便的利用位域把一个变量给按位分解。比如只需要4个大小在0到3的随即数,就可以只rand()一次,然后每个位域取2个二进制位即可,省时省空间。

        由于没有其他硬件平台实验条件,所以下边的例子基于intel x86硬件平台,内存排列为高位到低位,有SUN SPARC或其他平台的兄弟可以自行实验下。
位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: 

struct 位域结构名 
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度;

下面先看一个例子
struct
{
      unsigned char x1:2;
      unsigned char x2:2;   
      unsigned char x3:2;
      unsigned char x4:2;   
} wy;

这个位域定义的意思是,结构体内有四个变量x1,x2,x3,x4,每个变量占2个二进制位,那你猜猜这个结构体占大多空间呢?是1个字节,因为共8个二进制位,也就是1个字节。这个可以自己sizeof()一下进行验证。是不是节省了空间呢。

那么来看下一个例子,实现的是上述位域的作用2
union wy
{
     struct
     {
          unsigned char x1:2;
          unsigned char x2:2;
          unsigned char x3:2;
          unsigned char x4:2;
     }cn;
     unsigned char s;
} tmp;

union是联合,联合的好处就是里边的所有变量都用的是一个内存空间,不理解的参见谷歌。

          也就是说s和结构体cn用的是一个内存空间,都是1个字节。这样就可以把s给按位分解。这个时候不知道你想没有想这样一个问题,按位分解,如何分解,从高位到低位还是从低位到高位,下边我们通过实验来得出结论。
看程序:
#include "stdio.h"

union wy
{
     struct
     {
          unsigned char x1:2;
          unsigned char x2:2;
          unsigned char x3:2;
          unsigned char x4:2;
     }cn;
     unsigned char s;
} tmp;

int main()
{
     tmp.s = 174;                           //二进制形式是10101110
     printf("tmp.s is %d\n",tmp.s);
     printf("x1 is %d\n",tmp.cn.x1);
     printf("x2 is %d\n",tmp.cn.x2);
     printf("x3 is %d\n",tmp.cn.x3);
     printf("x4 is %d\n",tmp.cn.x4);
     return 0;
}
输出的结果是2,3,2,2。
从这个结果我们就可以看出来,这个按位分解是从地位到高位的。对照表:
x4  x3  x2  x1
10 10  11  10
高位<----地位

 但是有一点必须注意的是,这是在1个字节内的分配,如果涉及到跨字节的位域,则要进行另外的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为怎么删除自带的音乐_原来华为手机相册隐藏剪辑功能!按下这个开关,还能制作音乐相册...

华为手机相册你肯定在用&#xff0c;但除了最近删除、智能搜索之外&#xff0c;你还知道手机相册的其他功能吗&#xff1f;这里就分享一个&#xff0c;相册中隐藏的实用剪辑功能&#xff0c;按下这个开关&#xff0c;还能把照片制作成音乐相册。创作开关首先将华为手机上的相册…

使用 Dapr 缩短软件开发周期,提高生产效率

Microsoft DevOps 文档里的文章&#xff08;https://docs.microsoft.com/zh-cn/azure/devops/report/dashboards/cycle-time-and-lead-time?viewazure-devops&#xff09;中的这张图片在给我们介绍了 什么是周期时间 以及它如何影响我的项目流时非常有影响力。第一次输入 &quo…

各种加密算法

2019独角兽企业重金招聘Python工程师标准>>> 如基本的单向加密算法&#xff1a; BASE64 严格地说&#xff0c;属于编码格式&#xff0c;而非加密算法MD5(Message Digest algorithm 5&#xff0c;信息摘要算法)SHA(Secure Hash Algorithm&#xff0c;安全散列算法)H…

C++之namespace和::使用总结

1、命名空间(namespace使用总结) C++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字,…

利用Xshell实现非对称秘钥对安全登陆linux服务器(Centos、Ubuntu)

非对称加密算法简述&#xff1a;对称加密算法在加密和解密时使用的是同一个秘钥&#xff1b;而非对称加密算法需要两个密钥来进行加密和解密&#xff0c;这两个秘钥是公开密钥&#xff08;public key&#xff0c;简称公钥&#xff09;和私有密钥&#xff08;private key&#x…

一秒点击屏幕次数测试_安卓App性能专项测试流畅度深度解析

指标背景流畅度&#xff0c;顾名思义是用户感知使用App页面时的流畅情况。“App卡不卡”&#xff0c;这是用户最直接的感受。 但是要用量化之后的数据衡量流畅度&#xff0c;在Android平台这边并没有直接有效的方式/手段去监控。帧率&刷新频率首先需要了解到两个概念&#…

PowerDesigner新建模板

http://my.oschina.net/kzhou/blog/150290转载于:https://www.cnblogs.com/mawenzhu/p/4390195.html

C# 实例解释面向对象编程中的单一功能原则

在面向对象编程中&#xff0c;SOLID 是五个设计原则的首字母缩写&#xff0c;旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集&#xff0c;在他2000年的论文《设计原则与设计模式》中首次提出…

C++之virtual 方法

1、例子1 #include <iostream> class A { public:const char* fetchClassName() { return "A"; } };class B: public A { public:const char* fetchClassName() { return "B"; } };int main(void) {B obj_b;A &obj_a = obj_b;std::cout <<…

U盘安装Ubuntu三步走

需要工具&#xff1a; U盘、Ubuntu的ISO镜像、universal usb installer 1、下载Ubuntu &#xff08;1&#xff09; &#xff08;2&#xff09;我这里下载14.04版本 &#xff08;3&#xff09;我这里下载64位系统 下载后得到的是个torrent种子&#xff0c;双击后用迅雷下载即可 …

sdram 时钟相位_零基础学FPGA (二十五)必会! 从静态时序分析到SDRAM时序收敛(下篇)...

七、SDRAM工作时钟相位偏移计算本文引用地址&#xff1a;http://www.eepw.com.cn/article/279083.htm从上篇文章中我们知道&#xff0c;我们的数据是要经过一定的延时才会到达目标器件的&#xff0c;这个延时也就是相对于源寄存器的时钟发射沿的时间延时&#xff0c;数据在源寄…

星跃计划 | 新项目持续招募中!MSR Asia-MSR Redmond 联合科研计划邀你申请!

微软亚洲研究院与微软总部联合推出的“星跃计划”科研合作项目邀请你来报名&#xff01;本次“星跃计划”报名再次新增了来自微软 ED (Experiences Devices) Applied Research 全球总部的新项目&#xff0c;欢迎大家关注与申请&#xff01;还在等什么&#xff1f;加入“星跃计…

C++之map的前后遍历

java用迭代器只能往后迭代 但是C可以往后迭代和往前迭代 1、CMap往后迭代 map<int,int> amap; amap.insert(pair<int,int>(1,1)); amap.insert(pair<int.int>(2,2)); map<int,int>::iterator it; for(it amap.begin();it ! ampa.end();it…

Linux服务器上监控网络带宽与监控性能命令大全

【51CTO精选译文】本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据&#xff0c;并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。一些命令可以显示单个进程所使用的带宽。这样一来&#xff0c;用户很容易发…

Android的AlertDialog详解

AlertDialog的构造方法全部是Protected的&#xff0c;所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog&#xff0c;就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder创建对话框需要了解以下几个方法&#xff1a; s…

C++中之a[5](栈区)和int a=new int[5](堆区)有什么区别

1、int* anew int[5]需要判断内存是否分配成功&#xff0c;以及在不用时需要使用delete[] a进行内存释放&#xff1b; 2、如果不是a[5]&#xff0c;而是a[5000000000]或者更大的话&#xff0c;那一般情况下&#xff0c;就只能使用int* anew这种方式了。这个涉及到内存存放位置的…

最长严格上升子序列

该题应使用动归 时间限制: 1 s空间限制: 256000 KB题目等级 : 黄金 Gold题解查看运行结果题目描述 Description给一个数组a1, a2 ... an&#xff0c;找到最长的上升降子序列ab1<ab2< .. <abk&#xff0c;其中b1<b2<..bk。 输出长度即可。 输入描述 Input Descri…

workbench mysql mac_mysql workbench mac下载-mysql workbench mac 64位下载8.0.15 官方最新版__西西软件下载...

MySQL Workbench mac版是专为数据库架构师、开发人员和 DBA 打造的一个统一的可视化工具。MySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化的Sql开发、数据库建模、以及数据库管理功能。MySQL Workbench 提供了数据建模工具、SQL 开发工具和全面的管理工具(…

C# 使用Awaiter

可以对任何提供 GetAwaiter 方法并返回 awaiter 的对象使用 async 关键字。awaiter 用 OnCompleted 方法实现 INotifyCompletion 接口。此方法在任务完成时调用。下面的代码片段不是在任务中使用 await&#xff0c;而是使用任务的 GetAwaiter 方法。Task 类的 GetAwaiter 返回一…

模板-1-模板类的特化

2019独角兽企业重金招聘Python工程师标准>>> 类模板的特化 语义: 表明该模板类在特殊的类型下具有不同的行为.类的定义,应该与模板类放入一个头文件中,告知编译器该特化类的存在;类成员的定义,应该放入源文件中.该特化类就与普通类一样,是一个实实在在存在的实体.语…