php的bitset模块介绍和安装

BitSet是C++标准库,提供了基于二进制数据位处理。这里不做深入展开。

php同样提供了一个可供选择的bitset第三方位操作库提供C++同样的功能,详见:http://pecl.php.net/package/Bitset

前段时间我厂需要完成一个判端手机号码归属地实现CRM系统外呼电话自动在外地手机号码前加0的功能。需求分析:在这种交互响应(接打电话程序响应时间不能超过0.01s)时间要求非常严格的系统中,利用传统的KEY-VALUE数据库查表操作显然是不能达到要求的(全国号段大约有30w数据,查找号码归属地相对较慢),这时候可以有两个选择的解决方案:一个是利用排序算法(比如二分查找法),但要求样本集先排序而维护这个无序的号码数据段是件很麻烦的事。另一个是利用基于位图和位向量处理。我们选择使用后者因为它比二分查找更快更方便。

我主要用到bitset的3个方法:

(1)bitset_empty(int bits) 分配位数组空间,并把每一位初始化为0,位数组长度为bitcount,实现很简单

len *= CHAR_BIT; output_str = emalloc( len+1 ); output_str[len] = '\0';
for(count = 0; count < len; count++ )
    output_str[count ] = ( (bitset_data[ count/CHAR_BIT ] >> (count % CHAR_BIT)) & 1 ) ? '1' : '0'; 

(2)bitset_incl(unsigned char *bitset_data, int bit) 位数组位置bit上的值置为1,实际操作就1行,不过位数组长度做成了动态的,所以还涉及erealloc之类的操作

bitset_data[ bit/CHAR_BIT ] |= 1 << (bit % CHAR_BIT);

(3)bitset_in(unsigned char *bitset_data, int bit) 判断某个位置bit上的值是否为1,位操作语句比较精炼

if( bitset_data[ bit/CHAR_BIT ] & (1 << (bit % CHAR_BIT) ) ) RETURN_TRUE;

linux下php的bitset模块安装方法:

phpize (该命令是用来准备 PHP 扩展库的编译环境的)
./configure
make
make install
在php.ini添加extension = [编译出来的bitsit.so的位置],重启WebServer即可

 

你可以接着阅读下一篇,利用php数组实现Bitset位处理模块功能

posted on 2014-09-10 10:59  齐柏林飞艇  阅读(834)  评论(0编辑  收藏  举报