原文来自于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++中关于位域的概念的更多相关文章

  1. C语言中的位域、字节序、比特序、大小端

    转:http://www.360doc.com/content/13/0624/10/496343_295125641.shtml 1.比特序 / 位序 /  bit numbering / bit  ...

  2. WebLogic中的一些基本概念

    WebLogic中的一些基本概念   WebLogic 中的基本概念 上周参加了单位组织的WebLogic培训,为了便于自己记忆,培训后,整理梳理了一些WebLogic的资料,会陆续的发出来,下面是一 ...

  3. Activity中UI框架基本概念

    Activity中UI框架基本概念 Activity 是应用程序的基本组成部分,提供了可视的界面,UI容器, 与用户进行交互: 具体Acitivity是怎么样显示这些事视图元素以及响应事件交互的. 一 ...

  4. C#中一些易混淆概念总结

    C#中一些易混淆概念 这几天一直在复习C#基础知识,过程中也发现了自己以前理解不清楚和混淆的概念.现在给大家分享出来我的笔记: 一,.NET平台的重要组成部分都是有哪些 1)FCL (所谓的.NET框 ...

  5. 用人类社会工程学对C语言中的一些基本概念的剖析与理解

    最近在学C语言程序设计时总是遇到一些概念理解上的不清晰与混乱的地方,在一次偶然间想到了以前看过的一部电影<我是谁,没有一个系统是安全的>,里面的主角用社会工程学的想法结合黑客知识化险为夷, ...

  6. 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  7. 【C#小知识】C#中一些易混淆概念总结(六)---------解析里氏替换原则,虚方法 分类: C# 2014-02-08 01:53 1826人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  8. 【C#小知识】C#中一些易混淆概念总结(五)---------继承 分类: C# 2014-02-06 22:05 1106人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  9. 【C#小知识】C#中一些易混淆概念总结(五)---------深入解析C#继承

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

随机推荐

  1. BZOJ 2745: [HEOI2012]Bridge

    2745: [HEOI2012]Bridge Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 199  Solved: 90[Submit][Statu ...

  2. Android Studio之BuildConfig类

    https://blog.csdn.net/lvxiangan/article/details/71601451 Android Studio开发中,把一个module输出打包为jar文件,我们会发现 ...

  3. bzoj 1814: Ural 1519 Formula 1 插头dp经典题

    用的括号序列,听说比较快. 然并不会预处理,只会每回暴力找匹配的括号. #include<iostream> #include<cstdio> #include<cstr ...

  4. 【贪心】【CF1061B】 Views Matter

    Description 给定一个只有一行的,由 \(n\) 组小正方体组成的方块,每组是由 \(a_i\) 块小正方体竖直堆叠起来的,求最多能抽掉多少块使得它的左视图和俯视图不变.方块不会掉落 Inp ...

  5. opencv 应用程序无法正常启动(0xooooo7b)

    #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui ...

  6. mysql 优化总结

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. (laravel 可以使用 debugbar 包,可以及时发现低效 sql 语句,不使用索 ...

  7. range循环

    for i in range(10): #特殊写法,从0开始,步长为1,最大值小于10 print("loop",i) print("=========") f ...

  8. label和fieldset标签

    一.label标签 作用:可以通过for属性关联input标签的 id 属性,这样可以实现在点击label标签的内容时,可以使input文本框中获取输入的光标. <body> <la ...

  9. webpack 多页面|入口支持和公共组件单独打包--转载

    转载自:http://www.jb51.net/article/117490.htm 本篇主要介绍:如何自动构建入口文件,并生成对应的output:公共js库如何单独打包. 多入口文件,自动扫描入口. ...

  10. python实现域账号登陆

    需求:公司的网路比较变态,每天到了24点自动断开,为了避免一台测试机断网,用python做了一个自动登录 原理:时间到了24点的时候,每隔10秒检测是否可以ping通www.baidu.com,如果p ...