位字段(bit-field)

在存储空间很宝贵的情况下,有可能需要将多个对象保存在一个机器字中,一种常用的方法是:使用类似于编译器符号表的单个二进制位标志集合,外部强加的数据格式(如设备接口等寄存器)经常需要从字的分值中读取数值.

通常采用的方法是:定义一个于相关位的位置对应的"屏蔽码"集合,如:


#define KEYWORD (1<<0)
#define EXTRENAL (1<<2)
#define STATIC (1<<3)

或者


enum{
KEYWORD = 01,
EXTRENAL = 02,
STATIC = 04
};

这些数字必须是2的幂,这样就可以用移位运算,屏蔽运算以及补码运算进行简单的操作.比如:


flags |= EXTEERNAL | STATIC;//置1
flags &= ~(EXTEERNAL | STATIC);//置0

尽管这样的方法容易掌握,但是C语言提供了一种可以替代的方法,即直接定义和方位一个位字段的能力,不必通过以上的逻辑运算符,即位字段.通过位字段,以上的#define定义可以用以下的语句替代:


struct {
unsigned int is_keyword : 1;
unsigned int is_extern : 1;
unsigned int is_static : 1;
}flafs;

这里定义一个变量flags,它包含3个1位的字段,冒号后的数字表示字段的宽度(用二进制位数表示),字段被声明为unsigned int,以保证它们的无符号量.

单个字段的引用方式与其他结构成员相同,例如:

flags.is_keyword,
flags.is_extern

等;字段的作用与小整数相似,同其他整数一样,字段可以出现在算数表达式中,因此,可以表示为:


flags.is_extern = flags.is_static = 1;//置1
flags.is_extern = flags.is_static = 0;//置0
if(flags.is_extern == 0 && flags.is_static == 0)
...//用于对is_extern和is_static的测试

字段的所有属性几乎都同具体的实现有关,字段可以不命名,无名字段(只有冒号和宽度)起填充作用,特殊宽度0可以用来强制在下一边界上对齐.字段不是数组,没有地址,不能做&取地址操作.

(C)位字段(bit-field)的更多相关文章

  1. Django文档——Model字段类型(Field Types)

    大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...

  2. django字段类型(Field types)介绍

    字段类型(Field types) AutoField 它是一个根据 ID 自增长的 IntegerField 字段.通常,你不必直接使用该字段.如果你没在别的字段上指定主 键,Django 就会自动 ...

  3. 代码的坏味道(7)——临时字段(Temporary Field)

    坏味道--临时字段(Temporary Field) 特征 临时字段的值只在特定环境下有意义,离开这个环境,它们就什么也不是了. 问题原因 有时你会看到这样的对象:其内某个实例变量仅为某种特定情况而设 ...

  4. C# 属性(Property)和字段(Field)的区别

    导读: 近期学习过程中发现了一些问题,我的学习只是学习,敲代码就是敲代码,没有加入思考,也不问为什么就直接去敲人家写好的例子去敲,把知识都学死了,逐渐散失了思考能力,所以学习的兴趣大打折扣,正如那句话 ...

  5. union, enum, and struct, 以及结构填充和位字段实现。

    Table 4-9 Compiler storage of data objects by byte alignment Type Bytes Alignment char, bool, _Bool ...

  6. 20140321 sizeof 虚函数与虚函数表 静态数组空间 动态数组空间 位字段

    1.静态的数组空间char a[10];sizeof 不能用于1:函数类型 2:动态的数组空间new3:位字段 函数类型:int fun();sizeof(fun())计算的是返回类型的大小,并不是函 ...

  7. CodeGen字段循环Field Loop

    CodeGen字段循环Field Loop 字段循环是一个模板文件构造,它允许迭代CodeGen拥有的有关字段的集合.这些字段定义可以来自以下两个位置之一: •如果基于从存储库结构中获取的信息生成代码 ...

  8. Solr字段类型field type的定义

    摘要: Solr的字段类型定义了Solr如何解析字段数据并将数据检索出来,了解Solr的字段类型定义有助于更好的配置与使用Solr. 字段类型的定义 字段类型的定义主要包含如下四个方面的信息: 名称 ...

  9. Django——7 常用的查询 常用的模型字段类型 Field的常用参数 表关系的实现

    Django 常用的查询 常用的查询方法 常用的查询条件 常用字段映射关系 Field常用参数 表关系的实现 查用的查询方法 这是需要用到的数据 from django.http import Htt ...

随机推荐

  1. 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(一) table、entity、service、dao

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第二十一章 授予身份与切换身份(一) 1.使用场景 某个领导因为某 ...

  2. Ubuntu 14.04 使用VirtualBox 4.3.10 虚拟 Windows 7

    Ubuntu 14.04 尽管不错,可是有些事仅仅能在Windows下才干完毕,所以在 Ubuntu 下利用虚拟机软件Oracle VirtualBox,虚拟安装个Windows系统是个不错的选择. ...

  3. 对国外某hotel的内网域简单渗透

    Penetration Testing不单单是一个博客,更热衷于技术分享的平台. 本文将讲述对国外某一hotel的渗透测试,让更多的人安全意识得到提高,有攻才有防,防得在好,也有疏忽的地方,这就是为啥 ...

  4. TextView划线 android

    TextView  加下划线 . 中划线 下过如图: // 中划线 textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.A ...

  5. 【X240 QQ视频对方听不到声音】解决方法

    [X240 QQ视频对方听不到声音]解决方法: win7为例: 右键点击右下角的"小喇叭"图标,点击"录音设备",显演示样例如以下图: watermark/2/ ...

  6. 服务器,数据库连接注意mysql的user表

    update user set host='localhost' where user='root';

  7. canvas图片压缩,局部放大,像素处理

    直接上代码:(具体看注释) 需要引用jquery.min.js <!DOCTYPE html> <html lang="en"> <head> ...

  8. Koa2 + Mongoose + Log4js 持久化日志

    代码地址如下:http://www.demodashi.com/demo/12466.html  之前做的项目是采用 Express 框架进行搭建的,其中的日志管理采用了 winston + Post ...

  9. asp.net core 系列之Reponse caching之cache in-memory (2)

    这篇文章(主要翻译于官网,水平有限,见谅)讲解asp.net core 中的 Cache in-memory (内存缓存). Cache in-memory in ASP.NET Core Cachi ...

  10. 看完这篇再不会 View 的动画框架,我跪搓衣板

    引言 众所周知,一款没有动画的 app,就像没有灵魂的肉体,给用户的体验性很差.现在的 android 在动画效果方面早已空前的发展,1.View 动画框架 2.属性动画框架 3.Drawable 动 ...