基于https://github.com/RoaringBitmap/CRoaring实现的php版本bitmap
composer require buexplain/roaringrequire "vendor/autoload.php";
use Roaring\Bitmap;
//求并集
$a = new Bitmap();
$b = new Bitmap();
$a->addMany([1, 2]);
$b->addMany([2, 3]);
$c = $a->or($b);
print_r($c->toArray()); //[1, 2, 3]
//求交集
$a = new Bitmap();
$b = new Bitmap();
$a->addMany([1, 2, 3]);
$b->addMany([2, 3, 4]);
$c = $a->and($b);
print_r($c->toArray()); //[2, 3]
//求差集
$a = new Bitmap();
$b = new Bitmap();
$a->addMany([1, 2, 3]);
$b->addMany([1, 3, 4]);
$c = $a->andNot($b);
print_r($c->toArray()); //[2]
//求对称差集
$a = new Bitmap();
$b = new Bitmap();
$a->addMany([1, 2, 3]);
$b->addMany([3, 4, 5]);
$c = $a->xOr($b);
print_r($c->toArray()); //[1, 2, 4, 5]
//批量迭代整个bitmap
$a = new Bitmap();
$a->addRange(0, 100);
$generator = $a->iterate(10);
foreach ($generator as $v) {
print_r($v); //每次循环最多获取10个值
}PHP的整型数 int 的字长和平台有关, PHP 不支持无符号的 int,基于这个原因,要注意以下两点:
- 使用64位的bitmap时,能写入的最大值是
PHP_INT_MAX常量值。 - 当反序列化的数据来自其它语言的实现时,因为php对
uint64支持范围不完整,所以可能会出现异常情况,这一点尤其要注意。
/usr/local/bin/php8.2.10/bin/phpize
./configure --with-php-config=/usr/local/bin/php8.2.10/bin/php-config
make && make installphp --ini
vi /usr/local/bin/php8.2.10/etc/php.iniNo package 'libffi' found,执行命令:yum install libffi-devel错误:只允许在 C99 模式下使用‘for’循环初始化声明,升级gcc
感谢https://github.com/M31ayu同学review代码、提供darwin、arm64的编译机器。