跳转到主要内容
位函数适用于 UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32Float64 中任意一对类型。某些函数还支持 StringFixedString 类型。 结果类型为整数,其位数等于各参数中的最大位数。如果参数中至少有一个是有符号类型,则结果为有符号整数。如果参数是浮点数,则会将其转换为 Int64。

bitAnd

引入版本:v1.1.0 对两个值执行按位与运算。 语法
bitAnd(a, b)
参数 返回值 返回按位运算 a AND b 的结果。 示例 使用示例
Query
CREATE TABLE bits
(
    `a` UInt8,
    `b` UInt8
)
ENGINE = Memory;

INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);

SELECT
    a,
    b,
    bitAnd(a, b)
FROM bits
Response
┌─a─┬─b─┬─bitAnd(a, b)─┐
│ 0 │ 0 │            0 │
│ 0 │ 1 │            0 │
│ 1 │ 0 │            0 │
│ 1 │ 1 │            1 │
└───┴───┴──────────────┘

bitCount

引入版本:v20.3.0 计算一个数字的二进制表示中值为 1 的位数。 语法
bitCount(x)
参数 返回值 返回 x 中值为 1 的位数。UInt8
该函数不会将输入值转换为更大的类型 (符号扩展) 。 例如:bitCount(toUInt8(-1)) = 8
示例 使用示例
Query
SELECT bin(333), bitCount(333);
Response
┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │             5 │
└──────────────────┴───────────────┘

bitHammingDistance

引入版本:v21.1.0 返回两个数字的位表示之间的 Hamming 距离。 可与 SimHash 函数结合使用,以检测近似重复字符串。 距离越小,字符串越相似。 语法
bitHammingDistance(x, y)
参数
  • x — 用于计算 Hamming 距离的第一个数值。(U)Int*Float*
  • y — 用于计算 Hamming 距离的第二个数值。(U)Int*Float*
返回值 返回 xy 之间的 Hamming 距离。UInt8 示例 使用示例
Query
SELECT bitHammingDistance(111, 121);
Response
┌─bitHammingDistance(111, 121)─┐
│                            3 │
└──────────────────────────────┘

bitNot

引入版本:v1.1.0 执行按位取反运算。 语法
bitNot(a)
参数 返回值 返回 ~a 的结果,即将 a 的各个位取反后的值。 示例 使用示例
Query
SELECT
    CAST('5', 'UInt8') AS original,
    bin(original) AS original_binary,
    bitNot(original) AS result,
    bin(bitNot(original)) AS result_binary;
Response
┌─original─┬─original_binary─┬─result─┬─result_binary─┐
│        5 │ 00000101        │    250 │ 11111010      │
└──────────┴─────────────────┴────────┴───────────────┘

bitOr

引入版本:v1.1.0 对两个值执行按位或运算。 语法
bitOr(a, b)
参数 返回值 返回按位运算 a 或 b 的结果 示例 使用示例
Query
CREATE TABLE bits
(
    `a` UInt8,
    `b` UInt8
)
ENGINE = Memory;

INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);

SELECT
    a,
    b,
    bitOr(a, b)
FROM bits;
Response
┌─a─┬─b─┬─bitOr(a, b)─┐
│ 0 │ 0 │           0 │
│ 0 │ 1 │           1 │
│ 1 │ 0 │           1 │
│ 1 │ 1 │           1 │
└───┴───┴─────────────┘

bitRotateLeft

引入于:v1.1.0 将位向左旋转若干位。超出的位会回绕到右侧。 语法
bitRotateLeft(a, N)
参数 返回值 返回旋转后的值,其类型与 a 相同。(U)Int8/16/32/64 示例 使用示例
Query
SELECT 99 AS a, bin(a), bitRotateLeft(a, 2) AS a_rotated, bin(a_rotated);
Response
┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │       141 │ 10001101       │
└────┴──────────┴───────────┴────────────────┘

bitRotateRight

引入版本:v1.1.0 将位向右旋转若干位。移出的位会回绕到左侧。 语法
bitRotateRight(a, N)
参数 返回值 返回旋转后的值,其类型与 a 相同。(U)Int8/16/32/64 示例 使用示例
Query
SELECT 99 AS a, bin(a), bitRotateRight(a, 2) AS a_rotated, bin(a_rotated);
Response
┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │       216 │ 11011000       │
└────┴──────────┴───────────┴────────────────┘

bitShiftLeft

引入版本:v1.1.0 将某个值的二进制表示按指定的位数向左移位。 FixedStringString 会被视为一个单一的多字节值。 FixedString 值在移出时,移出的位会丢失。 相反,String 值会扩展额外的字节,因此不会丢失任何位。 语法
bitShiftLeft(a, N)
参数 返回值 返回移位后的值,其类型与 a 相同。 示例 二进制编码的用法示例
Query
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);
Response
┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐
│ 99 │ 01100011 │       140 │ 10001100                 │
└────┴──────────┴───────────┴──────────────────────────┘
十六进制编码使用示例
Query
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
Response
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐
│ abc │ 616263     │ &0        │ 06162630                    │
└─────┴────────────┴───────────┴─────────────────────────────┘
Fixed String 编码使用示例
Query
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
Response
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐
│ abc │ 616263                       │ &0        │ 162630                                        │
└─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘

bitShiftRight

引入版本:v1.1.0 将某个值的二进制表示按指定位数向右移位。 FixedStringString 会被视为一个多字节值。 FixedString 值在移出后,其位会丢失。 相反,String 值会通过附加额外字节进行扩展,因此不会丢失任何位。 语法
bitShiftRight(a, N)
参数 返回值 返回移位后的值,其类型与 a 相同。 示例 二进制编码用法示例
Query
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);
Response
┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐
│ 101 │ 01100101 │        25 │ 00011001                   │
└─────┴──────────┴───────────┴────────────────────────────┘
十六进制编码的使用示例
Query
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
Response
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐
│ abc │ 616263     │           │ 0616                          │
└─────┴────────────┴───────────┴───────────────────────────────┘
Fixed String 编码用法示例
Query
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
Response
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐
│ abc │ 616263                       │           │ 000616                                          │
└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘

bitSlice

引入版本:v22.2.0 返回一个子串,从 ‘offset’ 索引对应的位开始,长度为 ‘length’ 位。 语法
bitSlice(s, offset[, length])
参数
  • s — 要截取的 StringFixedStringStringFixedString
  • offset — 起始位位置 (从 1 开始计数) 。
  • 正值:从字符串开头开始计数。
  • 负值:从字符串末尾开始计数。 (U)Int8/16/32/64Float*
  • length — 可选。要提取的位数。
  • 正值:提取 length 位。
  • 负值:从 offset 提取到 (string_length - |length|)
  • 省略时:从 offset 提取到字符串末尾。
  • 如果 length 不是 8 的倍数,结果会在右侧用零填充。 (U)Int8/16/32/64Float*
返回值 返回一个包含提取后位的字符串,并以二进制序列表示。结果始终会填充到字节边界 (8 位的倍数) 。String 示例 使用示例
Query
SELECT bin('Hello'), bin(bitSlice('Hello', 1, 8));
SELECT bin('Hello'), bin(bitSlice('Hello', 1, 2));
SELECT bin('Hello'), bin(bitSlice('Hello', 1, 9));
SELECT bin('Hello'), bin(bitSlice('Hello', -4, 8));
Response
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 8))─┐
│ 0100100001100101011011000110110001101111 │ 01001000                     │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 2))─┐
│ 0100100001100101011011000110110001101111 │ 01000000                     │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 9))─┐
│ 0100100001100101011011000110110001101111 │ 0100100000000000             │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', -4, 8))─┐
│ 0100100001100101011011000110110001101111 │ 11110000                      │
└──────────────────────────────────────────┴───────────────────────────────┘

bitTest

引入版本:v1.1.0 接受任意数值,并将其转换为二进制形式,然后返回指定位置上该位的值。位序从右向左计数,从 0 开始。 语法
bitTest(a, i)
参数 返回值 返回 a 的二进制表示中第 i 位的值 UInt8 示例 使用示例
Query
SELECT bin(2), bitTest(2, 1);
Response
┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │             1 │
└──────────┴───────────────┘

bitTestAll

引入版本:v1.1.0 返回给定位置上所有位进行逻辑合取 (AND 运算) 后的结果。 按从右到左的顺序计数,从 0 开始。 两个位进行逻辑 AND 运算时,当且仅当两个输入位都为真,结果才为真。 语法
bitTestAll(a, index1[, index2, ... , indexN])
参数 返回值 返回逻辑合取的结果 UInt8 示例 用法示例 1
Query
SELECT bitTestAll(43, 0, 1, 3, 5);
Response
┌─bin(43)──┬─bitTestAll(43, 0, 1, 3, 5)─┐
│ 00101011 │                          1 │
└──────────┴────────────────────────────┘
使用示例 2
Query
SELECT bitTestAll(43, 0, 1, 3, 5, 2);
Response
┌─bin(43)──┬─bitTestAll(4⋯1, 3, 5, 2)─┐
│ 00101011 │                        0 │
└──────────┴──────────────────────────┘

bitTestAny

引入版本:v1.1.0 返回一个数中指定位置上所有位进行逻辑析取 (或运算) 后的结果。 按从右到左的顺序计数,从 0 开始。 如果两个输入位中至少有一个为真,这两个位之间的逻辑或就为真。 语法
bitTestAny(a, index1[, index2, ... , indexN])
参数 返回值 返回逻辑析取的结果 UInt8 示例 用法示例 1
Query
SELECT bitTestAny(43, 0, 2);
Response
┌─bin(43)──┬─bitTestAny(43, 0, 2)─┐
│ 00101011 │                    1 │
└──────────┴──────────────────────┘
用法示例 2
Query
SELECT bitTestAny(43, 4, 2);
Response
┌─bin(43)──┬─bitTestAny(43, 4, 2)─┐
│ 00101011 │                    0 │
└──────────┴──────────────────────┘

bitXor

引入版本:v1.1.0 对两个值执行按位异或 (XOR) 运算。 语法
bitXor(a, b)
参数 返回值 返回按位异或运算 a XOR b 的结果 示例 用法示例
Query
CREATE TABLE bits
(
    `a` UInt8,
    `b` UInt8
)
ENGINE = Memory;

INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);

SELECT
    a,
    b,
    bitXor(a, b)
FROM bits;
Response
┌─a─┬─b─┬─bitXor(a, b)─┐
│ 0 │ 0 │            0 │
│ 0 │ 1 │            1 │
│ 1 │ 0 │            1 │
│ 1 │ 1 │            0 │
└───┴───┴──────────────┘
最后修改于 2026年6月10日