位函数
位函数适用于以下任意类型对:UInt8
、UInt16
、UInt32
、UInt64
、Int8
、Int16
、Int32
、Int64
、Float32
或 Float64
。某些函数支持 String
和 FixedString
类型。
结果类型是一个整数,其位数等于其参数的最大位数。如果至少一个参数是有符号数,则结果是有符号数。如果参数是浮点数,则将其转换为 Int64。
bitAnd(a, b)
bitOr(a, b)
bitXor(a, b)
bitNot(a)
bitShiftLeft(a, b)
将值的二进制表示形式向左移动指定的位数。
FixedString
或 String
被视为单个多字节值。
FixedString
值的位在移出时会丢失。相反,String
值会用附加字节扩展,因此不会丢失任何位。
语法
bitShiftLeft(a, b)
参数
a
— 要移动的值。整数类型、String 或 FixedString。b
— 移动的位数。无符号整数类型,允许 64 位类型或更少。
返回值
- 移动后的值。
返回值的类型与输入值的类型相同。
示例
在以下查询中,bin 和 hex 函数用于显示移动后的值的位。
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
结果
┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐
│ 99 │ 01100011 │ 140 │ 10001100 │
└────┴──────────┴───────────┴──────────────────────────┘
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐
│ abc │ 616263 │ &0 │ 06162630 │
└─────┴────────────┴───────────┴─────────────────────────────┘
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐
│ abc │ 616263 │ &0 │ 162630 │
└─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘
bitShiftRight(a, b)
将值的二进制表示形式向右移动指定的位数。
FixedString
或 String
被视为单个多字节值。请注意,String
值的长度会随着位的移出而减少。
语法
bitShiftRight(a, b)
参数
a
— 要移动的值。整数类型、String 或 FixedString。b
— 移动的位数。无符号整数类型,允许 64 位类型或更少。
返回值
- 移动后的值。
返回值的类型与输入值的类型相同。
示例
查询
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);
SELECT 'abc' AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
结果
┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐
│ 101 │ 01100101 │ 25 │ 00011001 │
└─────┴──────────┴───────────┴────────────────────────────┘
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐
│ abc │ 616263 │ │ 0616 │
└─────┴────────────┴───────────┴───────────────────────────────┘
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐
│ abc │ 616263 │ │ 000616 │
└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘
bitRotateLeft(a, b)
bitRotateRight(a, b)
bitSlice(s, offset, length)
返回一个子字符串,该子字符串从 ‘offset’ 索引处的位开始,长度为 ‘length’ 位。位索引从 1 开始
语法
bitSlice(s, offset[, length])
参数
s
— s 是 String 或 FixedString。offset
— 位起始索引,正值表示左侧偏移,负值表示右侧缩进。位的编号从 1 开始。length
— 位子字符串的长度。如果指定负值,则该函数返回一个开放子字符串 [offset, array_length - length]。如果省略该值,则该函数返回子字符串 [offset, the_end_string]。如果 length 超过 s,则会截断。如果 length 不是 8 的倍数,则会在右侧填充 0。
返回值
- 子字符串。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 │
└──────────────────────────────────────────┴───────────────────────────────┘
byteSlice(s, offset, length)
请参阅函数 substring。
bitTest
接受任何整数并将其转换为 二进制形式,返回指定位置的位的值。计数是从右到左,从 0 开始。
语法
SELECT bitTest(number, index)
参数
number
– 整数。index
– 位的位置。
返回值
- 指定位置的位的值。UInt8。
示例
例如,十进制数字 43 在二进制数字系统中为 101011。
查询
SELECT bitTest(43, 1);
结果
┌─bitTest(43, 1)─┐
│ 1 │
└────────────────┘
另一个例子
查询
SELECT bitTest(43, 2);
结果
┌─bitTest(43, 2)─┐
│ 0 │
└────────────────┘
bitTestAll
返回给定位置的所有位的逻辑合取(AND 运算符)的结果。计数是从右到左,从 0 开始。
按位运算的合取
0 与 0 = 0
0 与 1 = 0
1 与 0 = 0
1 与 1 = 1
语法
SELECT bitTestAll(number, index1, index2, index3, index4, ...)
参数
number
– 整数。index1
、index2
、index3
、index4
– 位的位置。例如,对于位置集 (index1
、index2
、index3
、index4
),当且仅当其所有位置均为 true 时才为 true (index1
⋀index2
, ⋀index3
⋀index4
)。
返回值
- 逻辑合取的结果。UInt8。
示例
例如,十进制数字 43 在二进制数字系统中为 101011。
查询
SELECT bitTestAll(43, 0, 1, 3, 5);
结果
┌─bitTestAll(43, 0, 1, 3, 5)─┐
│ 1 │
└────────────────────────────┘
另一个例子
查询
SELECT bitTestAll(43, 0, 1, 3, 5, 2);
结果
┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│ 0 │
└───────────────────────────────┘
bitTestAny
返回给定位置的所有位的逻辑析取(OR 运算符)的结果。计数是从右到左,从 0 开始。
按位运算的析取
0 或 0 = 0
0 或 1 = 1
1 或 0 = 1
1 或 1 = 1
语法
SELECT bitTestAny(number, index1, index2, index3, index4, ...)
参数
number
– 整数。index1
、index2
、index3
、index4
– 位的位置。
返回值
- 逻辑析取的结果。UInt8。
示例
例如,十进制数字 43 在二进制数字系统中为 101011。
查询
SELECT bitTestAny(43, 0, 2);
结果
┌─bitTestAny(43, 0, 2)─┐
│ 1 │
└──────────────────────┘
另一个例子
查询
SELECT bitTestAny(43, 4, 2);
结果
┌─bitTestAny(43, 4, 2)─┐
│ 0 │
└──────────────────────┘
bitCount
计算数字的二进制表示形式中设置为 1 的位数。
语法
bitCount(x)
参数
返回值
- 输入数字中设置为 1 的位数。UInt8。
该函数不会将输入值转换为更大的类型(符号扩展)。因此,例如,bitCount(toUInt8(-1)) = 8
。
示例
以数字 333 为例。其二进制表示形式为:0000000101001101。
查询
SELECT bitCount(333);
结果
┌─bitCount(333)─┐
│ 5 │
└───────────────┘
bitHammingDistance
返回两个整数值的位表示形式之间的汉明距离。可以与 SimHash 函数一起使用,以检测半重复字符串。距离越小,这些字符串相同的可能性就越大。
语法
bitHammingDistance(int1, int2)
参数
返回值
- 汉明距离。UInt8。
示例
查询
SELECT bitHammingDistance(111, 121);
结果
┌─bitHammingDistance(111, 121)─┐
│ 3 │
└──────────────────────────────┘
使用 SimHash
SELECT bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat'));
结果
┌─bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat'))─┐
│ 5 │
└──────────────────────────────────────────────────────────────────────────────┘