首页 > 代码库 > 位图的应用
位图的应用
#include <stdio.h>#include <inttypes.h>//一共16位的位图,期中前八位是0,后八位是1static 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\n", BIT_AT(normal, i)); } return 0;}
结果:000000001248163264128
应用:通过一个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,非法为0static 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\n", i, i); } return 0;}
位图的应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。