跳至主要内容

位函数

位函数适用于来自 UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32Float64 的任何一对类型。某些函数支持 StringFixedString 类型。

结果类型是一个整数,其位数等于其参数的最大位数。如果至少有一个参数是有符号的,则结果是一个有符号数。如果参数是浮点数,则将其转换为 Int64。

bitAnd(a, b)

bitOr(a, b)

bitXor(a, b)

bitNot(a)

bitShiftLeft(a, b)

将值的二进制表示形式向左移动指定的位数。

FixedStringString 被视为单个多字节值。

FixedString 值的位在移出时会丢失。相反,String 值会用额外的字节扩展,因此不会丢失任何位。

语法

bitShiftLeft(a, b)

参数

返回值

  • 移动后的值。

返回值的类型与输入值的类型相同。

示例

在以下查询中,binhex 函数用于显示移动后的值的位。

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)

将值的二进制表示形式向右移动指定的位数。

FixedStringString 被视为单个多字节值。请注意,String 值的长度会随着位移出而减少。

语法

bitShiftRight(a, b)

参数

返回值

  • 移动后的值。

返回值的类型与输入值的类型相同。

示例

查询

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)

返回从“偏移量”索引处的位开始的长度为“长度”位的子字符串。位索引从 1 开始。

语法

bitSlice(s, offset[, length])

参数

  • s — s 是 字符串FixedString
  • offset — 位的起始索引。正值表示左侧的偏移量,负值表示右侧的缩进。位的编号从 1 开始。
  • length — 位子字符串的长度。如果指定负值,则该函数返回一个开放子字符串[offset, array_length - length]. 如果省略该值,则该函数返回子字符串[offset, the_end_string]. 如果 length 超出 s,它将被截断。如果 length 不是 8 的倍数,将在右侧填充 0。

返回值

示例

查询

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 在以 2 为底(二进制)的数字系统中的表示为 101011。

查询

SELECT bitTest(43, 1);

结果

┌─bitTest(43, 1)─┐
│ 1 │
└────────────────┘

另一个例子

查询

SELECT bitTest(43, 2);

结果

┌─bitTest(43, 2)─┐
│ 0 │
└────────────────┘

bitTestAll

返回给定位置处的所有位进行 逻辑合取(AND 运算符)的结果。计数从右到左,从 0 开始。

位运算的合取

0 AND 0 = 0

0 AND 1 = 0

1 AND 0 = 0

1 AND 1 = 1

语法

SELECT bitTestAll(number, index1, index2, index3, index4, ...)

参数

  • number – 整数。
  • index1index2index3index4 – 位的位置。例如,对于位置集 (index1index2index3index4) 为真当且仅当所有位置都为真 (index1index2, ⋀ index3index4)。

返回值

  • 逻辑合取的结果。 UInt8

示例

例如,数字 43 在以 2 为底(二进制)的数字系统中的表示为 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 OR 0 = 0

0 OR 1 = 1

1 OR 0 = 1

1 OR 1 = 1

语法

SELECT bitTestAny(number, index1, index2, index3, index4, ...)

参数

  • number – 整数。
  • index1index2index3index4 – 位的位置。

返回值

  • 逻辑析取的结果。 UInt8

示例

例如,数字 43 在以 2 为底(二进制)的数字系统中的表示为 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)

参数

  • x整数浮点数。该函数使用内存中的值表示。它允许支持浮点数。

返回值

  • 输入数字中设置为 1 的位的数量。 UInt8
注意

该函数不会将输入值转换为更大的类型(符号扩展)。因此,例如,bitCount(toUInt8(-1)) = 8

示例

以数字 333 为例。它的二进制表示形式为:0000000101001101。

查询

SELECT bitCount(333);

结果

┌─bitCount(333)─┐
│ 5 │
└───────────────┘

bitHammingDistance

返回两个整数值的位表示形式之间的 汉明距离。可与 SimHash 函数一起使用来检测半重复字符串。距离越小,这些字符串越有可能相同。

语法

bitHammingDistance(int1, int2)

参数

  • int1 — 第一个整数值。 Int64
  • int2 — 第二个整数值。 Int64

返回值

示例

查询

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 │
└──────────────────────────────────────────────────────────────────────────────┘