位运算函数适用于任何一对类型:UInt8
、UInt16
、UInt32
、UInt64
、Int8
、Int16
、Int32
、Int64
、Float32
或 Float64
。某些函数支持 String
和 FixedString
类型。
结果类型是一个整数,其位数等于参数的最大位数。如果至少有一个参数是有符号的,则结果是一个有符号数。如果参数是浮点数,则它被转换为 Int64。
bitAnd
引入于: v1.1
执行两个值之间的按位与操作。
语法
参数
返回值
返回按位操作 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
计算数字的二进制表示中被设置为一的位数。
语法
参数
返回值
返回 x
中被设置为一的位数。 UInt8
。
备注
该函数不会将输入值转换为更大的类型(符号扩展)。
例如:bitCount(toUInt8(-1)) = 8
。
示例
用法示例
SELECT bin(333), bitCount(333);
┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │ 5 │
└──────────────────┴───────────────┘
bitHammingDistance
引入于: v21.1
返回两个数字的位表示之间的 汉明距离。
可与 SimHash
函数一起使用,用于检测半重复字符串。
距离越小,字符串越相似。
语法
参数
返回值
返回 x
和 y
之间的汉明距离 UInt8
示例
用法示例
SELECT bitHammingDistance(111, 121);
┌─bitHammingDistance(111, 121)─┐
│ 3 │
└──────────────────────────────┘
bitNot
引入于: v1.1
执行按位取反操作。
语法
参数
返回值
返回 ~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
执行两个值之间的按位或操作。
语法
参数
返回值
返回按位操作 a OR 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
将位向左旋转指定数量的位置。脱落的位将环绕到右侧。
语法
参数
返回值
返回旋转后的值,其类型与 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
将位向右旋转指定数量的位置。脱落的位将环绕到左侧。
语法
参数
返回值
返回旋转后的值,其类型与 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
将值的二进制表示向左移动指定数量的位。
FixedString
或 String
被视为单个多字节值。
当 FixedString
的值被移位时,某些位会被丢失。
相反,String
值会用附加字节扩展,因此不会丢失任何位。
语法
参数
返回值
返回移位后的值,其类型与 a
相同。
示例
二进制编码的用法示例
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);
┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐
│ 99 │ 01100011 │ 140 │ 10001100 │
└────┴──────────┴───────────┴──────────────────────────┘
十六进制编码的用法示例
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐
│ abc │ 616263 │ &0 │ 06162630 │
└─────┴────────────┴───────────┴─────────────────────────────┘
Fixed String 编码的用法示例
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐
│ abc │ 616263 │ &0 │ 162630 │
└─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘
bitShiftRight
引入于: v1.1
将值的二进制表示向右移动指定数量的位。
FixedString
或 String
被视为单个多字节值。
当 FixedString
的值被移位时,某些位会被丢失。
相反,String
值会用附加字节扩展,因此不会丢失任何位。
语法
参数
返回值
返回移位后的值,其类型与 a
相同。
示例
二进制编码的用法示例
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);
┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐
│ 101 │ 01100101 │ 25 │ 00011001 │
└─────┴──────────┴───────────┴────────────────────────────┘
十六进制编码的用法示例
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐
│ abc │ 616263 │ │ 0616 │
└─────┴────────────┴───────────┴───────────────────────────────┘
Fixed String 编码的用法示例
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐
│ abc │ 616263 │ │ 000616 │
└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘
bitSlice
引入于: v22.2
返回从 '偏移量' 索引开始的子字符串,长度为 '长度' 位。
语法
bitSlice(s, offset[, length])
参数
返回值
返回包含提取位的字符串,以二进制序列表示。结果始终填充到字节边界(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开始。
语法
参数
返回值
返回 a
的二进制表示中位置 i
的位的值 UInt8
示例
用法示例
SELECT bin(2), bitTest(2, 1);
┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │ 1 │
└──────────┴───────────────┘
bitTestAll
引入于: v1.1
返回给定位置的所有位的 逻辑与(AND 运算符)结果。
从右到左计数,从0开始。
两个位之间的逻辑与在且仅在两个输入位都为真时为真。
语法
bitTestAll(a, index1[, index2, ... , indexN])
参数
返回值
返回逻辑与的结果 UInt8
示例
用法示例 1
SELECT bitTestAll(43, 0, 1, 3, 5);
┌─bin(43)──┬─bitTestAll(43, 0, 1, 3, 5)─┐
│ 00101011 │ 1 │
└──────────┴────────────────────────────┘
用法示例 2
SELECT bitTestAll(43, 0, 1, 3, 5, 2);
┌─bin(43)──┬─bitTestAll(4⋯1, 3, 5, 2)─┐
│ 00101011 │ 0 │
└──────────┴──────────────────────────┘
bitTestAny
引入于: v1.1
返回给定位置的所有位的 逻辑或(OR 运算符)结果。
从右到左计数,从0开始。
两个位之间的逻辑或在至少一个输入位为真时为真。
语法
bitTestAny(a, index1[, index2, ... , indexN])
参数
返回值
返回逻辑或的结果 UInt8
示例
用法示例 1
SELECT bitTestAny(43, 0, 2);
┌─bin(43)──┬─bitTestAny(43, 0, 2)─┐
│ 00101011 │ 1 │
└──────────┴──────────────────────┘
用法示例 2
SELECT bitTestAny(43, 4, 2);
┌─bin(43)──┬─bitTestAny(43, 4, 2)─┐
│ 00101011 │ 0 │
└──────────┴──────────────────────┘
bitXor
引入于: v1.1
执行两个值之间的按位异或(XOR)操作。
语法
参数
返回值
返回按位操作 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 │
└───┴───┴──────────────┘