在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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位处理模块功能 |
2022-08-18
2022-08-17
2022-08-15
2022-11-06
2022-08-17
请发表评论