“mask” 是一个 32 位的位掩码(bitmask),将其最低的 5 个特点位作为开关位。钙揭捉?码是经由过程和模式串 “p” 进行操作产生的。它设计成一个布隆过滤器(bloom filter),用于检猜一?字符是否涌如今当缁ぶ符串中。这种机制使查找操作十分敏捷,然则存在伪正的情况(false positives)。关于布隆过滤器,你想有更多懂得的话可以看看 这里 。对于本例,下方说清楚明了位掩码具体是若何产生的。
- mlast = m - 1
- /* process pattern[:-1] */
- for (mask = i = 0; i < mlast; i++) {
- mask |= (1 << (p[i] & 0x1F));
- }
- /* process pattern[-1] outside the loop */
- mask |= (1 << (p[mlast] & 0x1F));
字符串 “p” 的第一个字符为 ‘a’。字符‘a’的二进制表示为 97 = 1100001。保存最低的 5 个特点位,我们获得了 00001,是以变 “mask” 初次被设定为 10(1 << 1)。当全部字符串 “p” 都经由处理后,mask 值为 1110。那么,我们应当若何应用这个位掩码呢?经由过程下方这行代码,我们用其来检测字符 “c” 位于字符串 “p” 哪个地位。
- if ((mask & (1 << (c & 0x1F))))
下面,看下查找操作的轮回部分(真实代码为 C 实现,而非 Python):
- for i = 0 to n - m = 13:
- if s[i+m-1] == p[m-1]:
- if s[i:i+mlast] == p[0:mlast]:
- return i
- if s[i+m] not in p:
- i += m
- else:
- i += skip
- else:
- if s[i+m] not in p:
- i += m
- return -1
“s[i+m] not in p” 这行测试代码是基于位掩码实现的,“i += skip” 便对应坏字符跳跃。当主串下一?待匹配的字符在 “p” 中并未找到时,则履行 “i += m” 这行代码。
- 1>>> s1 = 'abc'
有关Python字符串对象完全的代码实现, 去这里看看(http://svn.python.org/projects/python/trunk/Objects/stringobject.c) 。
【编辑推荐】
- Python爬虫神器PyQuery的应用办法
推荐阅读
大年夜家都知道闯红灯是违法的,但几乎每小我都闯过红灯,为什么?就因为违法成本低、很少有人管,并且即便闯了也很难被及时发明。对闯红灯行动现场抓拍不过跟着人脸辨认技巧的成长,这个>>>详细阅读
本文标题:深入了解Python字符串对象的实现
地址:http://www.17bianji.com/lsqh/35733.html
1/2 1