BIT_COUNT()¶
BIT_COUNT(N) 返回参数 N 的二进制表示中值为 1 的位数,若 N 为 NULL 则返回 NULL。支持整数、二进制字符串、十六进制字面量以及浮点类型,对于负数采用二进制补码表示。
函数说明¶
BIT_COUNT(N) 统计参数 N 的二进制表示中值为 1 的位数。该函数支持多种输入类型:
整数类型:
TINYINT、SMALLINT、INT、BIGINT(有符号和无符号)。对于有符号整数,在 BIGINT 范围内使用二进制补码进行解释。浮点类型:
FLOAT、DOUBLE和DECIMAL。在计算位数之前,先将值四舍五入到最接近的整数。字符串类型:非二进制字符串(
CHAR、VARCHAR、TEXT)会先转换为BIGINT再计算位数。二进制字符串:
BINARY、VARBINARY和十六进制字面量(X'...'、_binary 0x...、UNHEX(...))统计每个字节中值为 1 的位数。
如果 N 为 NULL,函数返回 NULL。
语法¶
> BIT_COUNT(N)
参数说明¶
参数 |
说明 |
|---|---|
N |
必要参数。要统计置位(值为 1)位数的整数、浮点数、字符串或二进制值。 |
示例¶
DROP DATABASE IF EXISTS test_bit_count;
CREATE DATABASE test_bit_count;
USE test_bit_count;
-- 基本整数示例
SELECT BIT_COUNT(64) AS int_64, BIT_COUNT(BINARY 64) AS bin_64;
-- BIT_COUNT(0) = 0, BIT_COUNT(1) = 1, BIT_COUNT(2) = 1, BIT_COUNT(3) = 2, BIT_COUNT(255) = 8, BIT_COUNT(256) = 1
SELECT BIT_COUNT(0), BIT_COUNT(1), BIT_COUNT(2), BIT_COUNT(3), BIT_COUNT(255), BIT_COUNT(256);
-- NULL 返回 NULL
SELECT BIT_COUNT(NULL);
-- 负数(二进制补码)
SELECT BIT_COUNT(-1), BIT_COUNT(-2);
-- 无符号整数
SELECT BIT_COUNT(CAST(255 AS TINYINT UNSIGNED)), BIT_COUNT(CAST(65535 AS SMALLINT UNSIGNED)), BIT_COUNT(CAST(4294967295 AS INT UNSIGNED));
-- 浮点值(四舍五入到最近整数)
SELECT BIT_COUNT(CAST(64.9 AS DOUBLE)), BIT_COUNT(CAST(255.9 AS DECIMAL(10, 1)));
-- 十六进制字面量
SELECT BIT_COUNT(X'40'), BIT_COUNT(X'FF'), BIT_COUNT(X'FFFF');
-- 二进制字符串
SELECT BIT_COUNT(_binary X'40'), BIT_COUNT(_binary X'FF'), BIT_COUNT(_binary X'FFFF');
-- UNHEX 函数
SELECT BIT_COUNT(UNHEX('40')), BIT_COUNT(UNHEX('FF')), BIT_COUNT(UNHEX('FFFF'));
-- 字符串转换为 BIGINT
SELECT BIT_COUNT('64'), BIT_COUNT('255'), BIT_COUNT('-1');
-- 表中使用
CREATE TABLE t_bit_count(
id INT,
i BIGINT,
u BIGINT UNSIGNED,
s VARCHAR(10),
b VARBINARY(4)
);
INSERT INTO t_bit_count VALUES
(1, 64, 64, '64', X'40'),
(2, -1, 255, '-1', X'FF'),
(3, NULL, NULL, NULL, NULL),
(4, 64, 64, '64', _binary 0x40);
SELECT id, BIT_COUNT(i), BIT_COUNT(u), BIT_COUNT(s), BIT_COUNT(b) FROM t_bit_count ORDER BY id;
DROP TABLE t_bit_count;
DROP DATABASE test_bit_count;
注意事项¶
对于有符号整数类型,
BIT_COUNT()将值视为 BIGINT 二进制补码。这意味着BIT_COUNT(-1)返回 64(64 位二进制补码表示中所有位均为 1)。当传入非二进制字符串(例如
'64')时,会先转换为BIGINT值。空字符串或仅含空白字符的字符串转换为 0。对于二进制字符串(
BINARY、VARBINARY、十六进制字面量),按每个字节分别统计置位位数,得出所有字节中 1 位的总数。超出
BIGINT范围的值会被截断:大于最大BIGINT的值被视为最大BIGINT,小于最小BIGINT的值被视为最小BIGINT。