PECLに置いてあったBitSet。
日本語はおろか英語ドキュメントすらもまったく見つからず、ソースとテストコードくらいしか情報がないみたい。
よくわからないので使ってみます。
<?php
$bitset = new BitSet();
$bitset->set(1);
print($bitset); // 0100000000000000000000000000000000000000000000000000000000000000
おっと、これ、もしかしてビット演算を簡単にやってくれる便利クラスじゃね?
<?php
$bitset = new BitSet();
$bitset->set(1);
$bitset->set(3);
$bitset->set(5);
print($bitset); // 0101010000000000000000000000000000000000000000000000000000000000
$bitset->set(64); // Uncaught exception 'OutOfRangeException'
$bitset->set(0); // 全部1になる
print($bitset); // 1111111111111111111111111111111111111111111111111111111111111111
$bitset->clear(); // クリア
print($bitset); // 0000000000000000000000000000000000000000000000000000000000000000
2進数じゃなくてただのフラグじゃねーか!
64桁も取ってるのに、たったの64ビットしかフラグ管理できません。
役に立たなすぎる。
あと0ビット目だけを操作する方法がありません。
<?php
$bitset = new BitSet(8); // 8桁に設定
$bitset->set(1);$bitset->set(2);$bitset->set(3); // メソッドチェーン非対応 01110000
$bitset2 = BitSet::fromArray([1, 3, 5, 7]); // 01010101
$bitset->andOp($bitset2); // AND 01010000
$bitset->orOp($bitset2); // OR 01110101
$bitset->xorOp($bitset2); // XOR 00100101
$bitset->andNotOp($bitset2); // $bitsetは1、$bitset2は0のときに1 00100000
var_dump($bitset->size()); // BitSetの桁数。 8
var_dump($bitset->length()); // BitSetを表せる最小桁数? 01010000なら4
var_dump($bitset->cardinality()); // 1が立ってる数。
var_dump($bitset->isEmpty()); // 全て0のときだけtrue
var_dump($bitset->get(1)); // 引数桁が1ならtrue
andOp()やorOp()など一見便利そうなのですが、どれも返り値がNULLでメソッドチェーン非対応のため、とても使いにくいです。
ビット管理がしたいからといって、正直わざわざBitSetを使うメリットは全く感じられませんでした。