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:
");
68 show_settings(&box.st_view);
69 printf("
Box settings using unsigned int view:
");
70 show_settings1(box.ui_view);
71
72 printf("bits are %s
",
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("
Modified box settings:
");
81 show_settings(&box.st_view);
82 printf("
Box settings using unsigned int view:
");
83 show_settings1(box.ui_view);
84 printf("bits are %s
",
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.
",
93 pb->opaque == YES? "opaque": "transparent");
94 printf("The fill color is %s.
", colors[pb->fill_color]);
95 printf("Border %s.
",
96 pb->show_border == YES? "shown" : "not shown");
97 printf("The border color is %s.
", colors[pb->border_color]);
98 printf ("The border style is ");
99 switch(pb->border_style)
100 {
101 case SOLID : printf("solid.
"); break;
102 case DOTTED : printf("dotted.
"); break;
103 case DASHED : printf("dashed.
"); break;
104 default : printf("unknown type.
");
105 }
106 }
107
108 void show_settings1(unsigned short us)
109 {
110 printf("box is %s.
",
111 us & OPAQUE == OPAQUE? "opaque": "transparent");
112 printf("The fill color is %s.
",
113 colors[(us >> 1) & 07]);
114 printf("Border %s.
",
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.
"); break;
120 case B_DOTTED : printf("dotted.
"); break;
121 case B_DASHED : printf("dashed.
"); break;
122 default : printf("unknown type.
");
123 }
124 printf("The border color is %s.
",
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] = '