5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PECL::BitSet

Posted at

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を使うメリットは全く感じられませんでした。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?