MariaDBで外部ライブラリを使って64ビット以上の数値の1ビットの数をカウントする方法
MariaDBにおけるBIT_COUNT関数と64ビット以上の値
MariaDBのバージョンとBIT_COUNT関数
バージョン | 処理できる数値の最大ビット数 |
---|---|
10.3以前 | 64 |
10.4以降 | 64 (デフォルト)、bigint 型 (最大64ビット) |
64ビット以上の数値を処理するには
MariaDB 10.4以降を使用している場合は、BIT_COUNT
関数にbigint
型 (最大64ビット) の数値を渡すことで、64ビット以上の値を処理することができます。
-- MariaDB 10.4以降
SELECT BIT_COUNT(0b11111111111111111111111111111111); -- 64
SELECT BIT_COUNT(CAST(0b11111111111111111111111111111111 AS BIGINT)); -- 64
-- MariaDB 10.3以前
SELECT BIT_COUNT(0b11111111111111111111111111111111); -- 64
SELECT BIT_COUNT(CAST(0b11111111111111111111111111111111 AS BIGINT)); -- エラー
注意点
- MariaDB 10.3以前では、64ビット以上の数値を処理しようとすると、エラーが発生します。
bigint
型 (最大64ビット) の数値は、符号付きです。
補足
BIT_COUNT
関数は、ビット演算やデータベースのチューニングなど、さまざまな用途で使用できます。- MariaDB 10.4以降では、
BIT_COUNT
関数に加えて、BIT_LENGTH
関数やBIT_AND
関数などのビット操作関数が拡張されています。
-- MariaDB 10.4以降
-- 64ビット以下の数値
SELECT BIT_COUNT(0b11111111); -- 8
SELECT BIT_COUNT(12345); -- 16
-- 64ビット以上の数値
SELECT BIT_COUNT(0b11111111111111111111111111111111); -- 64
SELECT BIT_COUNT(CAST(0b11111111111111111111111111111111 AS BIGINT)); -- 64
-- ビット演算
SELECT BIT_COUNT(0b11111111 & 0b10101010); -- 4
SELECT BIT_COUNT(0b11111111 | 0b10101010); -- 12
-- データベースのチューニング
SELECT BIT_COUNT(column_name) FROM table_name WHERE column_name > 0; -- 高頻度に出現する値を分析
- 上記のサンプルコードは、MariaDB 10.4以降で動作します。
- サンプルコードでは、
BIT_COUNT
関数を使用して、さまざまな数値の1ビットの数をカウントしています。 - また、ビット演算やデータベースのチューニングなど、
BIT_COUNT
関数のさまざまな用途を示しています。
実行方法
- MariaDB 10.4以降をインストールします。
- サンプルコードをテキストファイルに保存します。
- MariaDB クライアントを使用して、テキストファイルを実行します。
64ビット以上の値を処理する他の方法
方法1: ビット演算を使用する
ビット演算を使用して、64ビット以上の数値の1ビットの数をカウントすることができます。
-- 64ビット以下の数値
SELECT (b1 & 0x01) + (b1 >> 1 & 0x01) + ... + (b1 >> 63 & 0x01) AS bit_count
FROM (SELECT 12345 AS b1) AS t;
-- 64ビット以上の数値
SELECT (b1 & 0x01) + (b1 >> 1 & 0x01) + ... + (b1 >> 63 & 0x01) AS bit_count
FROM (SELECT CAST(0b11111111111111111111111111111111 AS BIGINT) AS b1) AS t;
方法2: 自作関数を使用する
64ビット以上の値を処理する自作関数を作成することができます。
DELIMITER //
CREATE FUNCTION bit_count_bigint(value BIGINT) RETURNS INT
BEGIN
DECLARE bit_count INT;
DECLARE i INT;
SET bit_count = 0;
FOR i := 0 TO 63 DO
IF (value & (1 << i)) THEN
SET bit_count = bit_count + 1;
END IF;
END FOR;
RETURN bit_count;
END;
//
DELIMITER ;
SELECT bit_count_bigint(0b11111111111111111111111111111111); -- 64
- 64ビット以下の数値を処理する場合は、
BIT_COUNT
関数が最も簡単で効率的な方法です。 - 64ビット以上の数値を処理する場合は、ビット演算、自作関数、外部ライブラリのいずれかを選択することができます。
- ビット演算は最も高速な方法ですが、コードが複雑になる可能性があります。
- 自作関数は柔軟性に優れていますが、ビット演算よりも遅くなる可能性があります。
- 外部ライブラリは使い方が簡単ですが、パフォーマンスが低下する可能性があります。
mariadb