zoukankan      html  css  js  c++  java
  • 一个经典的位运算(忘记从哪搬过来的了,貌似不是自己写的)

      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] = '';
    138    
    139     return ps;
    140 }
  • 相关阅读:
    T100——MENU按钮
    vue 打包问题
    Python: 什么是*args和**kwargs
    windows服务器下部署Apache+Flask+Mod_wsgi+Vue
    树莓派 端口被占用的解决方案
    mac 终端命令总结
    Home Assistant 发现小米设备
    树莓派基于Home Assistant 查询在网设备
    Linux 命令集合-vim
    mac上的hassbian 启动报错1
  • 原文地址:https://www.cnblogs.com/doodle777/p/3154444.html
Copyright © 2011-2022 走看看