C++中关于位域的概念

原文来自于http://topic.csdn.net/t/20060801/11/4918904.html中的回复

位域

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

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

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

例如:

struct   bs 

 int   a:8; 
 int   b:2; 
 int   c:6; 
};

位域变量的说明与结构变量说明的方式相同。   可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:

struct   bs 

 int   a:8; 
 int   b:2; 
 int   c:6; 
}data;   
    说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:

  1.   一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

struct   bs 

 unsigned   a:4 
 unsigned   :0   /*空域*/ 
 unsigned   b:4   /*从下一单元开始存放*/ 
 unsigned   c:4 
}

  在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

  2.   由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。

  3.   位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

struct   k 

 int   a:1 
 int   :2   /*该2位不能使用*/ 
 int   b:3 
 int   c:2 
};

  从以上分析可以看出,位域在本质上就是一种结构类型,   不过其成员是按二进位分配的。 

  二、位域的使用

  位域的使用和结构成员的使用相同,其一般形式为:   位域变量名·位域名   位域允许用各种格式输出。

main(){ 
 struct   bs 
 { 
  unsigned   a:1; 
  unsigned   b:3; 
  unsigned   c:4; 
 }   bit,*pbit; 
 bit.a=1; 
 bit.b=7; 
 bit.c=15; 
 printf( "%d,%d,%d\n ",bit.a,bit.b,bit.c); 
 pbit=&bit; 
 pbit-> a=0; 
 pbit-> b&=3; 
 pbit-> c|=1; 
 printf( "%d,%d,%d\n ",pbit-> a,pbit-> b,pbit-> c); 
}

  上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。

  程序的9、10、11三行分别给三个位域赋值。(   应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符 "&= ",   该行相当于:   pbit-> b=pbit-> b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算 "|= ",   相当于:   pbit-> c=pbit-> c|1其结果为15。程序第17行用指针方式输出了这三个域的值。

http://blog.csdn.net/wuxuguang123/article/details/7916623

C++中关于位域的概念

时间: 2024-10-14 06:55:02

C++中关于位域的概念的相关文章

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

软件开发中几个基本概念

软件开发中几个基本概念 Peixu.Zhu 自己真的深切理解那些经常挂在嘴边的概念么? 抽象 Abstract 抽象的特点是仅存在于思想和理论之中,而非物理或者具体的存在.(不是指C++中的抽象类) 抽象是永存的,不会随着时空而发生变化. 具体 Concrete 具体的特点是物化的或者是具备物理形态,是真实存在的. 具体不是永存的,是随着时空而发生变化的,仅存于具体的时空之中. 具体和抽象的最大区别是是否随着时空而发生变化,即是否存在于我们的四维空间. 实体 Entity 实体是单独的个体事物(

elasticsearch中的几个概念总结

1.Geo spatial search : 地理空间搜索,可以在搜索查询中指定的某一距离内查找所要的内容,也能够返回以当前为圆心,逐渐增加圆的半径,直到找到所匹配到的内容. 参考:http://www.forwardsearch.dk/en/ForwardSearch/InDepth/Geo-spatial%20search.aspx 2.Multi tenancy:多租户 (1)Multi-tenancy means that different customers can have dif

云计算中的一些重要概念

什么是云计算      曾经被人严肃的问到过一个问题,那就是如果要你用一句话,向一个完全没有计算机知识的农民解释什么是云计算,你该如何说,记得我当时说了一堆类似服务器虚拟化,存储虚拟化等相关的东西,这个显然不够浅显.如果再给我一次机会,我会说:云计算就是把计算机放到了"云"上,家里面不用放计算机,使用的人只要从云上拉一根网线下来就可以做任何电脑相关的事情了,虽然这种解释对搞云计算的程序员来说不太准确,但是我想这差不多解释了云计算内涵的八九成了.  为什么需要云计算 IT相关技术的发展总

HTTP中关于幂等概念的理解

幂等性是分布式系统设计中十分重要的概念 幂等的方法意味着请求成功执行所得到的的结果不依赖于该方法被执行的次数.幂等指的是当你使用相同的值调用相同的功能时,结果完全一致,这是它的数学定义 如果具有相同输入的一个操作没有改变任何的事情,那么它是幂等的.但是,如果这个操作改变了任意的状态,比如说它记录了这个请求的最后时间,那么它就不是幂等的. 根据这一原则分析一下HTTP中的方法的幂等性 HTTP1.1规范声明GET,HEAD,PUT方法是幂等的,不过也可以自定义一个非幂等的doGet方法(但不应该这

Activity中UI框架基本概念

Activity中UI框架基本概念 Activity 是应用程序的基本组成部分,提供了可视的界面,与用户进行交互: 具体Acitivity是怎么样显示这些事视图元素以及响应事件交互的. 一Activity相关概念 Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用 PolicyManager.makeNewWindo创建: View:最基本的UI组件,表示屏幕上的一个矩形区域: DecorView:是Window中View的Roo

OC中多线程的一些概念

1.进程1.1>进程是指在系统中正在运行的一个应用程序(同时打开QQ和Xcode,系统会分别启动2个进程)1.2>每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 2.线程1.1>一个进程想要执行任务,必须得有线程(每个进程至少要有一条线程,即主线程)1.2>线程是进程的基本执行单元,进程的所有任务都在线程中执行3.多线程3.1>一个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务      进程→车间, 线程→车间工人3.2>多线程技术

CSS中的几个概念--------Day39

世界杯疯狂来袭,让这个原本就高温的夏季瞬间被引爆了,这肆虐的激情仿佛让一切都灼热了起来,绽放着刺目的光,工作之余总有那么一群人在那激烈的讨论着争辩着,抑不住的亢奋. 很不巧,往往这群身影中总有我的存在,哪怕我未曾说过一句话,可我依然很享受这种氛围.我常常想起那些青葱的校园时光,也总是和那么一群斗志满满,激情无限的家伙,打篮球,说篮球,就像这次马刺踏平热火,如果都还能聚在一起,估计又是一片争吵.是的,我爱篮球,胜过足球许多,但我还是坐在这里,假装着伪球迷的身份.终归是年龄有些大了,不再像以前那么苛

引用文档-软件测试分类及测试中三个主要概念

软件测试分类及测试中三个主要概念 原文链接:https://blog.csdn.net/qq_35867537/article/details/77477775 1.      软件测试分类 按测试技术分 按测试技术,软件测试可分为:黑盒测试.白盒测试.灰盒测试 黑盒测试:在程序接口进行测试,它只是检查程序功能是否按照规格说明书的规定正常使用.也被称为功能测试或者数据驱动测试. 白盒测试:要完全了解程序结构和处理过程,它按照程序内部逻辑测试程序,检验程序中每条通路是否按预定要求正确工作.也被称为