• 位图的应用


    #include <stdio.h>
    #include <inttypes.h>
    
    
    //一共16位的位图,期中前八位是0,后八位是1
    static const uint8_t normal[2] = { 
        0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
        1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
    };
    
    #define BIT_AT(a, i)
        ((unsigned int) (a)[(unsigned int) (i) >> 3] &     //计算出i属于第几组
        (1 << ((unsigned int) (i) & 7)))              //计算出i属于第几位
    
    int main(int argc, char **argv)
    {
    
        int i = 0;
        for (i = 0; i < 16; ++i)
        {   
            printf("%d
    ", BIT_AT(normal, i));
        }   
        return 0;
    }
    结果:
    0
    0
    0
    0
    0
    0
    0
    0
    1
    2
    4
    8
    16
    32
    64
    128

    应用:通过一个16 * 8的位图可以完整的表明128位的字符合法状况(合法为1,非法为0), 通过该方法可以很快的获得一个字符是否合法(如:是否是合法的url字符)

    #include <inttypes.h>
    #define T(v) 0
    
    //判断a的第i为是否合法
    #ifndef BIT_AT
    #define BIT_AT(a, i)                                                
      (!!((unsigned int) (a)[(unsigned int) (i) >> 3] &                  
       (1 << ((unsigned int) (i) & 7))))
    #endif
    
    //合法的url字符数组,一共128bit;其中合法为1,非法为0
    static const uint8_t normal_url_char[32] = {
    /*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel  */
            0    |   0    |   0    |   0    |   0    |   0    |   0    |   0,
    /*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si   */
            0    | T(2)   |   0    |   0    | T(16)  |   0    |   0    |   0,
    /*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb */
            0    |   0    |   0    |   0    |   0    |   0    |   0    |   0,
    /*  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us  */
            0    |   0    |   0    |   0    |   0    |   0    |   0    |   0,
    /*  32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '  */
            0    |   2    |   4    |   0    |   16   |   32   |   64   |  128,
    /*  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /*  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /*  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |   0,
    /*  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /*  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /*  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /*  88  X    89  Y    90  Z    91  [    92      93  ]    94  ^    95  _  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /*  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /* 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /* 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w  */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
    /* 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del */
            1    |   2    |   4    |   8    |   16   |   32   |   64   |   0, };
    
    #define IS_URL_CHAR(c)      (BIT_AT(normal_url_char, (unsigned char)c))
    
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
        int i = 0;
        for (i = 0; i < 127; ++i)
        {
            if (IS_URL_CHAR(i))
                printf("%c, %d
    ", i, i);
        }
        return 0;
    }
  • 相关阅读:
    面试题
    学习Javascript闭包(Closure)
    git命令
    css3 3d翻转效果
    meta 如何写
    Java String equals和==的比较
    MySQL Explain详解
    MySQL explain,type分析(转)
    python的内存分析和处理
    python lambda的使用
  • 原文地址:https://www.cnblogs.com/uangyy/p/5939532.html
Copyright © 2020-2023  润新知