1 /* dualview.c -- bit fields and bitwise operators */
2 #include <stdio.h>
3 /* BIT-FIELD CONSTANTS */
4 /* opaque and show */
5 #define YES 1
6 #define NO 0
7 /* line styles */
8 #define SOLID 0
9 #define DOTTED 1
10 #define DASHED 2
11 /* primary colors */
12 #define BLUE 4
13 #define GREEN 2
14 #define RED 1
15 /* mixed colors */
16 #define BLACK 0
17 #define YELLOW (RED | GREEN)
18 #define MAGENTA (RED | BLUE)
19 #define CYAN (GREEN | BLUE)
20 #define WHITE (RED | GREEN | BLUE)
21
22 /* BITWISE CONSTANTS */
23 #define OPAQUE 0x1
24 #define FILL_BLUE 0x8
25 #define FILL_GREEN 0x4
26 #define FILL_RED 0x2
27 #define FILL_MASK 0xE
28 #define BORDER 0x100
29 #define BORDER_BLUE 0x800
30 #define BORDER_GREEN 0x400
31 #define BORDER_RED 0x200
32 #define BORDER_MASK 0xE00
33 #define B_SOLID 0
34 #define B_DOTTED 0x1000
35 #define B_DASHED 0x2000
36 #define STYLE_MASK 0x3000
37
38 const char * colors[
8] = {
"black",
"red",
"green",
"yellow",
39 "blue",
"magenta",
"cyan",
"white"};
40 struct box_props {
41
42 unsigned
int opaque :
1;
43 unsigned
int fill_color :
3;
44 unsigned
int :
4;
45 unsigned
int show_border :
1;
46 unsigned
int border_color :
3;
47 unsigned
int border_style :
2;
48 unsigned
int :
2;
49 };
50
51 union Views
/* look at data as struct or as unsigned short */
52 {
53 struct box_props st_view;
54 unsigned
int ui_view;
55 };
56
57 void show_settings(
const struct box_props *
pb);
58 void show_settings1(unsigned
short);
59 char * itobs(unsigned
int n,
char *
ps);
60
61 int main(
void)
62 {
63 /* create Views object, initialize struct box view */
64 union Views box =
{{YES, YELLOW , YES, GREEN, DASHED}};
65 char bin_str[
8 *
sizeof(unsigned
int) +
1];
66
67 printf(
"Original box settings:\n");
68 show_settings(&
box.st_view);
69 printf(
"\nBox settings using unsigned int view:\n");
70 show_settings1(box.ui_view);
71
72 printf(
"bits are %s\n",
73 itobs(box.ui_view,bin_str));
74 box.ui_view &= ~FILL_MASK;
/* clear fill bits */
75 box.ui_view |= (FILL_BLUE | FILL_GREEN);
/* reset fill */
76 box.ui_view ^= OPAQUE;
/* toggle opacity */
77 box.ui_view |= BORDER_RED;
/* wrong approach */
78 box.ui_view &= ~STYLE_MASK;
/* clear style bits */
79 box.ui_view |= B_DOTTED;
/* set style to dotted*/
80 printf(
"\nModified box settings:\n");
81 show_settings(&
box.st_view);
82 printf(
"\nBox settings using unsigned int view:\n");
83 show_settings1(box.ui_view);
84 printf(
"bits are %s\n",
85 itobs(box.ui_view,bin_str));
86
87 return 0;
88 }
89
90 void show_settings(
const struct box_props *
pb)
91 {
92 printf(
"Box is %s.\n",
93 pb->opaque == YES?
"opaque":
"transparent");
94 printf(
"The fill color is %s.\n", colors[pb->
fill_color]);
95 printf(
"Border %s.\n",
96 pb->show_border == YES?
"shown" :
"not shown");
97 printf(
"The border color is %s.\n", colors[pb->
border_color]);
98 printf (
"The border style is ");
99 switch(pb->
border_style)
100 {
101 case SOLID : printf(
"solid.\n");
break;
102 case DOTTED : printf(
"dotted.\n");
break;
103 case DASHED : printf(
"dashed.\n");
break;
104 default : printf(
"unknown type.\n");
105 }
106 }
107
108 void show_settings1(unsigned
short us)
109 {
110 printf(
"box is %s.\n",
111 us & OPAQUE == OPAQUE?
"opaque":
"transparent");
112 printf(
"The fill color is %s.\n",
113 colors[(us >>
1) &
07]);
114 printf(
"Border %s.\n",
115 us & BORDER == BORDER?
"shown" :
"not shown");
116 printf (
"The border style is ");
117 switch(us &
STYLE_MASK)
118 {
119 case B_SOLID : printf(
"solid.\n");
break;
120 case B_DOTTED : printf(
"dotted.\n");
break;
121 case B_DASHED : printf(
"dashed.\n");
break;
122 default : printf(
"unknown type.\n");
123 }
124 printf(
"The border color is %s.\n",
125 colors[(us >>
9) &
07]);
126
127 }
128
129 /* convert int to binary string */
130 char * itobs(unsigned
int n,
char *
ps)
131 {
132 int i;
133 static int size =
8 *
sizeof(unsigned
int);
134
135 for (i = size -
1; i >=
0; i--, n >>=
1)
136 ps[i] = (
01 & n) +
'0';
137 ps[size] =
'\0';
138
139 return ps;
140 }
转载于:https://www.cnblogs.com/doodle777/p/3154444.html
相关资源:各显卡算力对照表!