位函数适用于 UInt8、UInt16、UInt32、UInt64、Int8、Int16、Int32、Int64、Float32 或 Float64 中任意一对类型。某些函数还支持 String 和 FixedString 类型。
结果类型为整数,其位数等于各参数中的最大位数。如果参数中至少有一个是有符号类型,则结果为有符号整数。如果参数是浮点数,则会将其转换为 Int64。
bitAnd
引入版本:v1.1.0
对两个值执行按位与运算。
语法
bitAnd(a, b)参数
返回值
返回按位运算 a AND b 的结果。
示例
使用示例
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┌─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。
示例
使用示例
SELECT bin(333), bitCount(333);┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │ 5 │
└──────────────────┴───────────────┘bitHammingDistance
引入版本:v21.1.0
返回两个数字的位表示之间的 Hamming 距离。
可与 SimHash 函数结合使用,以检测近似重复字符串。
距离越小,字符串越相似。
语法
bitHammingDistance(x, y)参数
返回值
返回 x 和 y 之间的 Hamming 距离。UInt8
示例
使用示例
SELECT bitHammingDistance(111, 121);┌─bitHammingDistance(111, 121)─┐
│ 3 │
└──────────────────────────────┘bitNot
引入版本:v1.1.0
执行按位取反运算。
语法
bitNot(a)参数
返回值
返回 ~a 的结果,即将 a 的各个位取反后的值。
示例
使用示例
SELECT
CAST('5', 'UInt8') AS original,
bin(original) AS original_binary,
bitNot(original) AS result,
bin(bitNot(original)) AS result_binary;┌─original─┬─original_binary─┬─result─┬─result_binary─┐
│ 5 │ 00000101 │ 250 │ 11111010 │
└──────────┴─────────────────┴────────┴───────────────┘bitOr
引入版本:v1.1.0
对两个值执行按位或运算。
语法
bitOr(a, b)参数
返回值
返回按位运算 a 或 b 的结果
示例
使用示例
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;┌─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/64N— 左旋的位数。UInt8/16/32/64
返回值
返回旋转后的值,其类型与 a 相同。(U)Int8/16/32/64
示例
使用示例
SELECT 99 AS a, bin(a), bitRotateLeft(a, 2) AS a_rotated, bin(a_rotated);┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │ 141 │ 10001101 │
└────┴──────────┴───────────┴────────────────┘bitRotateRight
引入版本:v1.1.0
将位向右旋转若干位。移出的位会回绕到左侧。
语法
bitRotateRight(a, N)参数
a— 要旋转的值。(U)Int8/16/32/64N— 向右旋转的位置数。UInt8/16/32/64
返回值
返回旋转后的值,其类型与 a 相同。(U)Int8/16/32/64
示例
使用示例
SELECT 99 AS a, bin(a), bitRotateRight(a, 2) AS a_rotated, bin(a_rotated);┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │ 216 │ 11011000 │
└────┴──────────┴───────────┴────────────────┘bitShiftLeft
引入版本:v1.1.0
将某个值的二进制表示按指定的位数向左移位。
FixedString 或 String 会被视为一个单一的多字节值。
FixedString 值在移出时,移出的位会丢失。
相反,String 值会扩展额外的字节,因此不会丢失任何位。
语法
bitShiftLeft(a, N)参数
a— 要移位的值。(U)Int*或String或FixedStringN— 移位的位数。UInt8/16/32/64
返回值
返回移位后的值,其类型与 a 相同。
示例
二进制编码的用法示例
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);┌──a─┬─bin(a)───┬─a_shifted─┬─bin(a_shifted)─┐
│ 99 │ 01100011 │ 140 │ 10001100 │
└────┴──────────┴───────────┴────────────────┘十六进制编码使用示例
-- The shifted value is binary, so it is shown with `hex`.
SELECT 'abc' AS a, hex(a), hex(bitShiftLeft(a, 4)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 06162630 │
└─────┴────────┴───────────┘Fixed String 编码使用示例
SELECT toFixedString('abc', 3) AS a, hex(a), hex(bitShiftLeft(a, 4)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 162630 │
└─────┴────────┴───────────┘bitShiftRight
引入版本:v1.1.0
将某个值的二进制表示按指定位数向右移位。
FixedString 或 String 会被视为一个多字节值。
FixedString 值在移出后,其位会丢失。
相反,String 值会通过附加额外字节进行扩展,因此不会丢失任何位。
语法
bitShiftRight(a, N)参数
a— 要移位的值。(U)Int*或String或FixedStringN— 移位的位数。UInt8/16/32/64
返回值
返回移位后的值,其类型与 a 相同。
示例
二进制编码用法示例
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);┌───a─┬─bin(a)───┬─a_shifted─┬─bin(a_shifted)─┐
│ 101 │ 01100101 │ 25 │ 00011001 │
└─────┴──────────┴───────────┴────────────────┘十六进制编码的使用示例
-- The shifted value is binary, so it is shown with `hex`.
SELECT 'abc' AS a, hex(a), hex(bitShiftRight(a, 12)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 0616 │
└─────┴────────┴───────────┘Fixed String 编码用法示例
SELECT toFixedString('abc', 3) AS a, hex(a), hex(bitShiftRight(a, 12)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 000616 │
└─────┴────────┴───────────┘bitSlice
引入版本:v22.2.0
返回一个子串,从 'offset' 索引对应的位开始,长度为 'length' 位。
语法
bitSlice(s, offset[, length])参数
s— 要截取的String或FixedString。String或FixedStringoffset— 起始位位置 (从 1 开始计数) 。- 正值:从字符串开头开始计数。
- 负值:从字符串末尾开始计数。
(U)Int8/16/32/64或Float* length— 可选。要提取的位数。- 正值:提取
length位。 - 负值:从
offset提取到(string_length - |length|)。 - 省略时:从
offset提取到字符串末尾。 - 如果
length不是 8 的倍数,结果会在右侧用零填充。(U)Int8/16/32/64或Float*
返回值
返回一个包含提取后位的字符串,并以二进制序列表示。结果始终会填充到字节边界 (8 位的倍数) 。String
示例
使用示例
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));┌─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— 要转换的数值。(U)Int8/16/32/64或Float*i— 要返回的位的位置。(U)Int8/16/32/64或Float*
返回值
返回 a 的二进制表示中第 i 位的值 UInt8
示例
使用示例
SELECT bin(2), bitTest(2, 1);┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │ 1 │
└──────────┴───────────────┘bitTestAll
引入版本:v1.1.0
返回给定位置上所有位进行逻辑合取 (AND 运算) 后的结果。 按从右到左的顺序计数,从 0 开始。
两个位进行逻辑 AND 运算时,当且仅当两个输入位都为真,结果才为真。
语法
bitTestAll(a, index1[, index2, ... , indexN])参数
a— 整数值。(U)Int8/16/32/64index1, ...— 一个或多个位的位置。(U)Int8/16/32/64
返回值
返回逻辑合取的结果 UInt8
示例
用法示例 1
SELECT bitTestAll(43, 0, 1, 3, 5);┌─bitTestAll(43, 0, 1, 3, 5)─┐
│ 1 │
└────────────────────────────┘使用示例 2
SELECT bitTestAll(43, 0, 1, 3, 5, 2);┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│ 0 │
└───────────────────────────────┘bitTestAny
引入版本:v1.1.0
返回一个数中指定位置上所有位进行逻辑析取 (或运算) 后的结果。 按从右到左的顺序计数,从 0 开始。
如果两个输入位中至少有一个为真,这两个位之间的逻辑或就为真。
语法
bitTestAny(a, index1[, index2, ... , indexN])参数
a— 整数值。(U)Int8/16/32/64index1, ...— 一个或多个位的位置。(U)Int8/16/32/64
返回值
返回逻辑析取的结果 UInt8
示例
用法示例 1
SELECT bitTestAny(43, 0, 2);┌─bitTestAny(43, 0, 2)─┐
│ 1 │
└──────────────────────┘用法示例 2
SELECT bitTestAny(43, 4, 2);┌─bitTestAny(43, 4, 2)─┐
│ 0 │
└──────────────────────┘bitXor
引入版本:v1.1.0
对两个值执行按位异或 (XOR) 运算。
语法
bitXor(a, b)参数
返回值
返回按位异或运算 a XOR b 的结果
示例
用法示例
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;┌─a─┬─b─┬─bitXor(a, b)─┐
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 0 │
└───┴───┴──────────────┘