BIT_COUNT()

BIT_COUNT(N) 返回参数 N 的二进制表示中值为 1 的位数,若 N 为 NULL 则返回 NULL。支持整数、二进制字符串、十六进制字面量以及浮点类型,对于负数采用二进制补码表示。

函数说明

BIT_COUNT(N) 统计参数 N 的二进制表示中值为 1 的位数。该函数支持多种输入类型:

  • 整数类型TINYINTSMALLINTINTBIGINT(有符号和无符号)。对于有符号整数,在 BIGINT 范围内使用二进制补码进行解释。

  • 浮点类型FLOATDOUBLEDECIMAL。在计算位数之前,先将值四舍五入到最接近的整数。

  • 字符串类型:非二进制字符串(CHARVARCHARTEXT)会先转换为 BIGINT 再计算位数。

  • 二进制字符串BINARYVARBINARY 和十六进制字面量(X'...'_binary 0x...UNHEX(...))统计每个字节中值为 1 的位数。

如果 NNULL,函数返回 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。

  • 对于二进制字符串(BINARYVARBINARY、十六进制字面量),按每个字节分别统计置位位数,得出所有字节中 1 位的总数。

  • 超出 BIGINT 范围的值会被截断:大于最大 BIGINT 的值被视为最大 BIGINT,小于最小 BIGINT 的值被视为最小 BIGINT