第 15 章 位操作(dualview)

  1 /*-----------------------------------
  2     dualview.c -- 位字段和按位运算符
  3 -----------------------------------*/
  4 
  5 #include <stdio.h>
  6 #include <limits.h>
  7 
  8 //边框线样式
  9 #define SOLID    0
 10 #define    DOTTED    1
 11 #define DASHED    2
 12 
 13 //三原色
 14 #define BLUE    4
 15 #define GREEN    2
 16 #define RED        1
 17 
 18 //混合颜色
 19 #define BLACK    (RED & GREEN & BLUE)
 20 #define YELLOW    (RED | GREEN)
 21 #define MAGENTA    (RED | BLUE)
 22 #define CYAN    (GREEN | BLUE)
 23 #define WHITE    (RED | BLUE | GREEN)
 24 
 25 //按位方法中用到的符号常量
 26 #define OPAQUE        0x1
 27 #define FILL_BLUE    0x8
 28 #define FILL_GREEN    0x4
 29 #define FILL_RED    0x2
 30 #define FILL_MASK    0xE        //掩码
 31 #define BORDER            0x100
 32 #define BORDER_BLUE        0x800
 33 #define BORDER_GREEN    0x400
 34 #define BORDER_RED        0x200
 35 #define BORDER_MASK        0xE00
 36 #define B_SOLID            0
 37 #define B_DOTTED        0x1000
 38 #define B_DASHED        0x2000
 39 #define STYLE_MASK        0x3000
 40 
 41 struct box_props
 42 {
 43     unsigned int opaque            : 1;
 44     unsigned int fill_color        : 3;
 45     unsigned int                : 4;
 46     unsigned int show_border    : 1;
 47     unsigned int border_color    : 3;
 48     unsigned int border_style    : 2;
 49     unsigned int                : 2;
 50 };
 51 
 52 //把数据看作结构或 unsigned short 类型的变量
 53 union Views
 54 {
 55     struct box_props st_view;
 56     unsigned short us_view;
 57 };
 58 
 59 const char *color[8] = 
 60 {
 61     "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"
 62 };
 63 
 64 void show_settings(const struct box_props *pb);
 65 void show_setting1(unsigned short);
 66 char* itobs(int n, char *ps);
 67 void show_bstr(const char *str);
 68 
 69 int main()
 70 {
 71     printf("size of struct box_props is %d bit
", CHAR_BIT * sizeof(struct box_props));
 72     printf("size of unsigned short is %d bit
", CHAR_BIT * sizeof(unsigned short));
 73 
 74     //创建 Vies 联合,并初始化 initialize struct box view
 75     union Views box = {{true, YELLOW, true, GREEN, DASHED}};
 76     char bin_str[8 * sizeof(unsigned int) + 1];
 77 
 78     printf("
Original box settings:
");
 79     show_settings(&box.st_view);
 80     printf("
Box settings using unsigned int view:
");
 81     show_setting1(box.us_view);
 82     //printf("bits are %s
", itobs(box.us_view, bin_str));
 83     printf("bits are:
");
 84     show_bstr(itobs(box.us_view, bin_str));
 85     
 86     box.us_view &= ~FILL_MASK;        //把表示填充色的位清零
 87     box.us_view |= CYAN;            //重置填充色
 88     box.us_view ^= OPAQUE;            //切换透明位
 89     box.us_view &= ~BORDER_MASK;    //边框颜色位清零
 90     box.us_view |= BORDER_RED;
 91     box.us_view &= ~STYLE_MASK;        //样式位清零
 92     box.us_view |= B_DOTTED;        //边框样式设置为点
 93     printf("
Modified box settings:
");
 94     show_settings(&box.st_view);
 95     printf("
Box settings using unsigned int view:
");
 96     show_setting1(box.us_view);
 97     //printf("bits are %s
", itobs(box.us_view, bin_str));
 98     printf("bits are:
");
 99     show_bstr(itobs(box.us_view, bin_str));
100 
101     return 0;
102 }
103 
104 void show_settings(const struct box_props *pb)
105 {
106     printf("Box is %s.
", pb->opaque ? "opaque" : "transparent");
107     printf("The fill color is %s.
", color[pb->fill_color]);
108     printf("Border %s.
", pb->show_border ? "shown" : "not shown");
109     printf("The border color is %s.
", color[pb->border_color]);
110     
111     printf("The border style is ");
112     switch (pb->border_style)
113     {
114     case SOLID:
115         printf("solid.
");
116         break;
117 
118     case DOTTED:
119         printf("dotted.
");
120         break;
121 
122     case DASHED:
123         printf("dashed.
");
124         break;
125 
126     default:
127         printf("unknown type.
");
128         break;
129     }
130 }
131 
132 void show_setting1(unsigned short us)
133 {
134     printf("Box is %s.
", (us & OPAQUE) ? "opaque" : "transparent");
135     printf("The fill color is %s.
", color[(us >> 1) & 0x07]);
136     printf("Border %s.
", (us & BORDER) == BORDER ? "shown" : "not shown");
137     printf("The border color is %s.
", color[us >> 9 & 0x07]);
138 
139     printf("The border style is ");
140     switch (us & STYLE_MASK)
141     {
142     case B_SOLID:
143         printf("solid.
");
144         break;
145 
146     case B_DOTTED:
147         printf("dotted.
");
148         break;
149 
150     case B_DASHED:
151         printf("dashed.
");
152         break;
153 
154     default:
155         printf("unknown style");
156         break;
157     }
158 }
159 
160 char* itobs(int n, char *ps)
161 {
162     const static int size = CHAR_BIT * sizeof(int);
163 
164     for (int i(size - 1); i >= 0; --i, n >>= 1)
165         ps[i] = (01 & n) + '0';
166 
167     ps[size] = '';
168 
169     return ps;
170 }
171 
172 //以 4 位为一组,显示二进制字符串
173 void show_bstr(const char *str)
174 {
175     int i = 0;
176 
177     while (str[i])        //str[i] 不是空字符
178     {
179         putchar(str[i]);
180 
181         if (++i % 4 == 0 && str[i])
182             putchar(' ');
183     }
184 
185     putchar('
');
186 }
dualview.c

原文地址:https://www.cnblogs.com/web1013/p/9223229.html