code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MySQLでビットの数を数える

MySQLにて数値型でフラグを管理しているフィールドがある。ビットがいくつ立っているかをSQL文内で調べたかったので関数を作成した。

アルゴリズムについてはビットを数える・探すアルゴリズムの最後のアルゴリズムを拝借した。

drop function if exists COUNTBIT;

delimiter |

CREATE DEFINER='root'@'localhost'
FUNCTION COUNTBIT (n INT)
	RETURNS INT
	DETERMINISTIC
	BEGIN
		SET n = (n & 0x55555555) + (n >> 1 & 0x55555555);
		SET n = (n & 0x33333333) + (n >> 2 & 0x33333333);
		SET n = (n & 0x0f0f0f0f) + (n >> 4 & 0x0f0f0f0f);
		SET n = (n & 0x00ff00ff) + (n >> 8 & 0x00ff00ff);
		RETURN (n  & 0x0000ffff) + (n >> 16 & 0x0000ffff);
	END;
|

delimiter ;

実行した結果。

mysql> select COUNTBIT(0b10101011);
+----------------------+
| COUNTBIT(0b10101011) |
+----------------------+
|                    5 |
+----------------------+
1 row in set (0.00 sec)

mysql> select COUNTBIT(2147483647);
+----------------------+
| COUNTBIT(2147483647) |
+----------------------+
|                   31 |
+----------------------+
1 row in set (0.00 sec)

mysql> select COUNTBIT(0x55555555);
+----------------------+
| COUNTBIT(0x55555555) |
+----------------------+
|                   16 |
+----------------------+
1 row in set (0.00 sec)

考えた人、すごいなぁ。

関連記事
タグ:MySQL
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。