zoukankan      html  css  js  c++  java
  • (C)位字段(bit-field)

    位字段(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可以用来强制在下一边界上对齐.字段不是数组,没有地址,不能做&取地址操作.

  • 相关阅读:
    sql交集、差集、并集
    控件自适应文本宽度
    pivot列行转换,自动计算分组,解决groupby问题
    echart-scatter使用散点图,带坐标和项目名称
    下载文件根据浏览器判断文件名,解决兼容性问题
    sql中类型转换涉及的性能差异之convert和cast
    js使用正则表达式对文本框进行限制输入
    Aspose.Words.dll根据模板生成word详解
    Windows服务开发
    SqlBulkCopy学习(导入海量数据的类)
  • 原文地址:https://www.cnblogs.com/yanghong-hnu/p/5712231.html
Copyright © 2011-2022 走看看