satan 通过 Google 阅读器发送给您的内容:
于 12-5-3 通过 averiany涂鸦馆 作者:averainy
位字段是一个signed int 或unsigned int中一组相邻的位.位字段由一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度.例如,以下声明建立了4个1位字段:
struct { unsigned int autofd: 1; unsigned int bldfc: 1; unsigned int undln; 1; unsigned int itals: 1; } prnt;
该定义使prnt包含了4哥1位字段.现在,您可以使用普通的结构成员运算符将值赋给单独的字段:
prnt.itals=0;
prnt.undln=1;
因为每个字段都正好为1位,所以1和0是唯一可以用于赋值的值.
有时,对于某个设置有两个以上的选择,因此您需要用多位来表示所有的选择.因为字段不限于1位大小.我们只需要确保值没有超出字段的容量即可.
位字段实例
位字段通常作为存储数据的一个更加紧凑的方法.例如,假设您决定表示一个在屏幕上的方框的属性.让我们使问题更加简单,假设方框具有如下属性:
- 框是不透明或者透明的.
- 框的填充色选自一下调色板:黑色,红色,绿色,黄色,蓝色,紫色,青色或者白色.
- 边框可见或隐藏.
- 边框颜色与填充色使用相同的调色板.
- 边框可以使用实线,点线或虚线样式.
您可以使用一个短度的变量或全长结构成员来表示每个属性,但是这样做太浪费数据位.例如,您只需要1位来指明方框是透明或者不透明,只需要1位来指明边框是显示还是隐藏.可以使用3位单元的8哥可能值来表示8种可能的颜色值,并且2位单元也足以表示3种可能的边框样式..那么总共10位就足以表示这5哥属性的所有可能的设置.
下面是一个示例程序
/* fields.c -- define and use fields */ #include <stdio.h> /* opaque and show */ #define YES 1 #define NO 0 /* line styles */ #define SOLID 0 #define DOTTED 1 #define DASHED 2 /* primary colors */ #define BLUE 4 #define GREEN 2 #define RED 1 /* mixed colors */ #define BLACK 0 #define YELLOW (RED | GREEN) #define MAGENTA (RED | BLUE) #define CYAN (GREEN | BLUE) #define WHITE (RED | GREEN | BLUE) const char * colors[8] = {"black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"}; struct box_props { unsigned int opaque : 1; unsigned int fill_color : 3; unsigned int : 4; unsigned int show_border : 1; unsigned int border_color : 3; unsigned int border_style : 2; unsigned int : 2; }; void show_settings(const struct box_props * pb); int main(void) { /* create and initialize box_props structure */ struct box_props box = {YES, YELLOW , YES, GREEN, DASHED}; printf("Original box settings:\n"); show_settings(&box); box.opaque = NO; box.fill_color = WHITE; box.border_color = MAGENTA; box.border_style = SOLID; printf("\nModified box settings:\n"); show_settings(&box); return 0; } void show_settings(const struct box_props * pb) { printf("Box is %s.\n", pb->opaque == YES? "opaque": "transparent"); printf("The fill color is %s.\n", colors[pb->fill_color]); printf("Border %s.\n", pb->show_border == YES? "shown" : "not shown"); printf("The border color is %s.\n", colors[pb->border_color]); printf ("The border style is "); switch(pb->border_style) { case SOLID : printf("solid.\n"); break; case DOTTED : printf("dotted.\n"); break; case DASHED : printf("dashed.\n"); break; default : printf("unknown type.\n"); } }
编译即可运行.
注意:1,可以使用与初始化普通的结构相同的语法来初始化一个位字段结构:
struct box_props box = {YES,YELLOW,YES,GREEN,DASHED};
2,类似的,你可以为位字段成员赋值:
box.fill_color=WHITE;
3,你还可以使用字段成员作为switch语句的值表达式.你甚至可以把位字段成员作为一个数组索引:
printf("The fill color is %s.\n",collors[pb->fill_color]);
注意,数组colors的定义使得每个数组索引对应于一个表示颜色的字符串,而该颜色又将这个索引值作为其数字颜色值.例如,数组左饮1对应于字符串"red",并且红色的颜色值也为1.
以上内容来源于:C Primer Plus< 第5版>中文版
本文作者:averainy | 本文地址: 固定链接 | 我的腾讯微博|我的google+
本站文章除特殊标明者外均为原创,版权所有,如需转载,请以超链接形式注明作者和原始出处及本声明
相关日志
可从此处完成的操作:
- 使用 Google 阅读器订阅averiany涂鸦馆
- 开始使用 Google 阅读器,轻松地与您喜爱的所有网站保持同步更新
没有评论:
发表评论