libevent 自己撸了一套 isalpha isdigit isspace
这几个函数ctype里有哇 ,为何自己撸一套呢?
不明白。更高的性能?
其原理如下
char 取值只有 0 ~ 255 共256种可能
8个32位的整形可以完整得一一对应 32*8 = 256
于是我就在8个32位整形那里做标记,你是我就标记上
比如 islower
'a' --> 'z' 是小写字母吧 对应的ascii值 97 -- 122
你看我来个最简单的实现版本
char lower_table[256]={0};
lower_table['a'] = 1
lower_table['b'] = 1
...
lower_table['z'] = 1
然后 lower_table[c] == 1 就表示 lower了吧。==0就是非lower
显然这样实现是完全可以的,就是浪费了点内存啊,需要256个全局char哦
那,我用位数组呢? 是不是只要8分之一的空间了~~~
于是就用8个32位整形做标记
lower_table['a'] 就不是第97个char了,而是第97位 = 32+32+32+1 {0,0,0,0x2,0,0,0,0} 注意,这里的0~31 , 0对应于1 1其实是2
lower_table['b']就不是第98个char了,而是第98位 = 32+32+32+2 {0,0,0,0x4,0,0,0,0} 0x4 二进制 (100)2
lower_table['c']就不是第99个char了,而是第99位 = 32+32+32+3 {0,0,0,0x8,0,0,0,0} 0x4 二进制 (1000)2
把它们或起来 :) 就是答案 {0,0,0, 0x7fffffe , 0,0,0,0}
EVUTIL_ISLOWER_TABLE[8] 就是这个值啦