fork(1) download
  1. /* dualview.c -- битовые поля и побитовые операции */
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. #include <limits.h>
  5. /* КОНСТАНТЫ БИТОВЫХ ПОЛЕЙ */
  6. /* стили линии */
  7. #define SOLID 0
  8. #define DOTTED 1
  9. #define DASHED 2
  10. /* основные цвета */
  11. #define BLUE 4
  12. #define GREEN 2
  13. #define RED 1
  14. /* смешанные цвета */
  15. #define BLACK 0
  16. #define YELLOW (RED | GREEN)
  17. #define MAGENTA (RED | BLUE)
  18. #define CYAN (GREEN | BLUE)
  19. #define WHITE (RED | GREEN | BLUE)
  20.  
  21. /* ПОБИТОВЫЕ КОНСТАНТЫ */
  22. #define OPAQUE 0x1
  23. #define FILL_BLUE 0x8
  24. #define FILL_GREEN 0x4
  25. #define FILL_RED 0x2
  26. #define FILL_MASK 0xE
  27. #define BORDER 0x100
  28. #define BORDER_BLUE 0x800
  29. #define BORDER_GREEN 0x400
  30. #define BORDER_RED 0x200
  31. #define BORDER_MASK 0xE00
  32. #define B_SOLID 0
  33. #define B_DOTTED 0x1000
  34. #define B_DASHED 0x2000
  35. #define STYLE_MASK 0x3000
  36.  
  37. const char * colors[8] = {"черный", "красный", "зеленый", "желтый",
  38. "синий", "пурпурный", "голубой", "белый"};
  39. struct box_props {
  40. bool opaque : 1;
  41. unsigned int fill_color : 3;
  42. unsigned int : 4;
  43. bool show_border : 1;
  44. unsigned int border_color : 3;
  45. unsigned int border_style : 2;
  46. unsigned int : 2;
  47. };
  48.  
  49. union Views /* взгляд на данные как на struct или как на unsigned short */
  50. {
  51. struct box_props st_view;
  52. unsigned short us_view;
  53. };
  54.  
  55. void show_settings(const struct box_props * pb);
  56. void show_settings1(unsigned short);
  57. char * itobs(int n, char * ps);
  58.  
  59. int main(void)
  60. {
  61. /* создание объекта Views, инициализация представления в виде структуры */
  62. union Views box = {{true, YELLOW , true, GREEN, DASHED}};
  63. char bin_str[8 * sizeof(unsigned int) + 1];
  64.  
  65. printf("Исходные настройки окна:\n");
  66. show_settings(&box.st_view);
  67. printf("\nНастройки окна с использованием представления unsigned short:\n");
  68. show_settings1(box.us_view);
  69.  
  70. printf("комбинация битов %s\n",
  71. itobs(box.us_view,bin_str));
  72. box.us_view &= ~FILL_MASK; /* очистить биты фона */
  73. box.us_view |= (FILL_BLUE | FILL_GREEN); /* переустановить фон */
  74. box.us_view ^= OPAQUE; /* переключить прозрачность */
  75. box.us_view |= BORDER_RED; /* ошибочный подход */
  76. box.us_view &= ~STYLE_MASK; /* очистить биты стиля */
  77. box.us_view |= B_DOTTED; /* установить пунктирный стиль */
  78. printf("\nИзмененные настройки окна:\n");
  79. show_settings(&box.st_view);
  80. printf("\nНастройки окна с использованием представления unsigned short:\n");
  81. show_settings1(box.us_view);
  82. printf("Комбинация битов %s\n",
  83. itobs(box.us_view,bin_str));
  84.  
  85. return 0;
  86. }
  87.  
  88. void show_settings(const struct box_props * pb)
  89. {
  90. printf("Окно %s.\n",
  91. pb->opaque == true ? "непрозрачно": "прозрачно");
  92. printf("Цвет фона %s.\n", colors[pb->fill_color]);
  93. printf("Рамка %s.\n",
  94. pb->show_border == true ? "отображается" : "не отображается");
  95. printf("Цвет рамки %s.\n", colors[pb->border_color]);
  96. printf("Стиль рамки ");
  97. switch(pb->border_style)
  98. {
  99. case SOLID : printf("сплошной.\n"); break;
  100. case DOTTED : printf("пунктирный.\n"); break;
  101. case DASHED : printf("штриховой.\n"); break;
  102. default : printf("неизвестного типа.\n");
  103. }
  104. }
  105.  
  106. void show_settings1(unsigned short us)
  107. {
  108. printf("Окно %s.\n",
  109. (us & OPAQUE) == OPAQUE? "непрозрачно": "прозрачно");
  110. printf("Цвет фона %s.\n",
  111. colors[(us >> 1) & 07]);
  112. printf("Рамка %s.\n",
  113. (us & BORDER) == BORDER? "отображается" : "не отображается");
  114. printf ("Стиль рамки ");
  115. switch(us & STYLE_MASK)
  116. {
  117. case B_SOLID : printf("сплошной.\n"); break;
  118. case B_DOTTED : printf("пунктирный.\n"); break;
  119. case B_DASHED : printf("штриховой.\n"); break;
  120. default : printf("неизвестного типа.\n");
  121. }
  122. printf("Цвет рамки %s.\n",
  123. colors[(us >> 9) & 07]);
  124.  
  125. }
  126.  
  127. char * itobs(int n, char * ps)
  128. {
  129. int i;
  130. const static int size = CHAR_BIT * sizeof(int);
  131.  
  132. for (i = size - 1; i >= 0; i--, n >>= 1)
  133. ps[i] = (01 & n) + '0';
  134. ps[size] = '\0';
  135.  
  136. return ps;
  137. }
  138.  
Success #stdin #stdout 0s 4520KB
stdin
Standard input is empty
stdout
Исходные настройки окна:
Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.

Настройки окна с использованием представления unsigned short:
Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Стиль рамки штриховой.
Цвет рамки зеленый.
комбинация битов 00000000000000000010010100000111

Измененные настройки окна:
Окно прозрачно.
Цвет фона голубой.
Рамка отображается.
Цвет рамки желтый.
Стиль рамки пунктирный.

Настройки окна с использованием представления unsigned short:
Окно прозрачно.
Цвет фона голубой.
Рамка отображается.
Стиль рамки пунктирный.
Цвет рамки желтый.
Комбинация битов 00000000000000000001011100001100