详见K&R书上的6.9 section
bit-field来源:
bit-field是为了节约存储空间而创造的一种数据结构(to pack several objects into a single
machine word)
bit-field用途:
Externally-imposed data formats,such interfaces to hardware devices,also often
require the ability to get a pieces of a word
定义方法:
struct (tag) {
bit-field list ~~~
} bit-field variable list;
由定义方法可见,bit-field也是以structure的形式组织起来的数据结构,只不过是以二进制进行分发
的而已。其中bit-field list表示方法: type fieldnamme:width; width:field的宽度,以bit
表示,还是举个例子来看吧:
struct bf{
unsigned int is_keyword:1;
unsigned int is_extern:1;
unsigned int is static:1;
}flags;
定义了一个bit-field变量flags,它包括3个1-bit的field,访问bit-field其实和访问一般数据结
构的成员一样,例如:
flags.is_static=0;
在定义bit-field的时候,有以下几点要注意(K&R版本的观点)
1、Almost everything about fields is implemention-dependent ! Whether a field may
overlap a word boundary is implemention-defined.
2、Fields can only be declared as intS,for protability,specify signed or unsigned
explicitly.
3、unnamed field can be used for padding(没有名字的field可以用来作为填充或者调整用)
例如:
struct bf{
unsigned int a:2;
unsigned int  :4; /*该4位不能用*/
unsigned int b:2;
};
4、Special width 0 may be used to force alignment at the next word boundary.
(如果width=0的话,那么下一个field就被强制存放在下一个内存单元里面了),例如:
struct bf{

unsigned int a:2;
unsigned int  :0; /*空的field*/
unsigned int b:2; /*从下一个单元开始存放*/
};
5、Bit-field are not arrays and they do not have addresses , so the operator &
can not be applied on them.
某些国内的教科书上与K&R对field定义规则的描述还是有些不同,比如谭浩强版本写道:
1) 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,
应从下一单元起存放该位域。
 2) 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位
二进位。

位域 bit-fields C的重要数据结构相关推荐

  1. 位域(bit fields)简介

    位域(bit fields)简介 1.简介 位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存 ...

  2. C++ 位域(Bit Fields)

    位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数 ...

  3. C语言中的位域 bit field [转]

    一.位域             有些信息在存储时,并不需要占用一个完整的字节,       而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1       两种状态,       用一位 ...

  4. 原 C语言之强大的结构体,【C语言资料更新】结构体的“卫浴”(位域)

    文/Edward 接下来再回到我们结构体的话题中来,我们之前讲结构体的时候,都是用int,char之类的数据类型来定义结构体的成员变量的,这些成员变量都有一个共性,就是他们的长度都是一个字节,或者一个 ...

  5. JDK源码 - BitSet的实现

    java.util.BitSet是个很有趣的类,了解其内部实现对正确的使用非常重要. 对象构造: Java代码   private final static int ADDRESS_BITS_PER_ ...

  6. itpt_TCPL 第五章:指针和数组 - 第八章:UNIX系统接口

    2016.10.11 - 01.09 个人英文阅读练习笔记(极低水准). 10.11 第五章:指针和数组 指针是保存一个变量的地址的变量.指针在C中被大量使用,部分是因为有时候它是唯一表达计算的方法, ...

  7. 嵌入式Linux开发板_WIFI无线网卡驱动移植

    在线课堂:https://www.100ask.net/index(课程观看) 论  坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...

  8. 基于ARM板s3c2440---wifi网卡

    基础知识 wifi网卡有两种工作模式: 一种是无线终端模式(STA):这个模式就是我们平时用手机连接wifi时的模式,相当于客户端. 一种是无线热点模式(AP):家里的无线路由器均是这个模式,手机开热 ...

  9. 嵌入式Linux——WIFI网卡

    CSDN仅用于增加百度收录权重,排版未优化,日常不维护.请访问:www.hceng.cn 查看.评论. 本博文对应地址: https://hceng.cn/2018/06/21/嵌入式Linux--W ...

  10. 《Effective Java》中文版第3版 读书笔记

    评论中有电子档资源哦  ^_^ 第1章引言 第2章创建和销毁对象 第1条:用静态工厂方法代替构造器 静态工厂方法与构造器不同的第一大优势在于,它们有名称.  静态工厂方法与构造器不同的第二大优势在于, ...

最新文章

  1. 0409-0416的笔记
  2. Spring-基于Java类的配置
  3. Python基础练习题合集
  4. C#中的事件和委托(续)
  5. 用yum安装完mysql后没有mysqld的问题
  6. JavaEE实战班第十一天
  7. Unreal Engine 4 —— 多线程任务构建
  8. 面试官:你给我手写个RPC框架看看
  9. 六、传递、返回复杂类型的对象
  10. SharePoint2007文档的点击率统计
  11. [GPS模块]NEMA-0183(GPRMC GPGGA)数据格式详细解释
  12. DDNS请求到底请求了什么
  13. 水星路由器wan口ip显示0_路由器wan口ip地址显示0.0.0.0怎么办(2)
  14. 杜比AC-3与DTS的音效对比 浅解
  15. 强化学习—— 离散与连续动作空间(随机策略梯度与确定策略梯度)
  16. 《牧羊少年的奇幻之旅》-保罗 柯艾略
  17. 液晶显示屏LCD1602
  18. 如何快速将十进制转化为二进制
  19. How to use even ?
  20. ubuntu如何查看网卡名称_修改Ubuntu网卡名称

热门文章

  1. 阐述:SIP协议是什么
  2. iOS上传头像, 相册权限,相册权限,拍照上传,相册选择图片,拍照页面语言设置,保存到相册...
  3. Linux+Nginx+Apache+Atlas+Mysql+Php+Redis 分部式部署详细版
  4. 代码规范(一)——java篇
  5. JBoss5 启动报错java.lang.IllegalArgumentException: ...
  6. [CSS]详解display:inline | block |inline-block的区别
  7. java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...
  8. 使用JQuery Mobile实现手机新闻浏览器
  9. 用Hibernate tool从实体对象生成数据库表
  10. mysql 半径,MySQL基于距离半径的搜索和区域搜索POI实践