2012年5月3日星期四

c语言位字段笔记

 
 

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+
本站文章除特殊标明者外均为原创,版权所有,如需转载,请以超链接形式注明作者和原始出处及本声明

相关日志


 
 

可从此处完成的操作:

 
 

没有评论:

发表评论