slug: /zh/sql-reference/functions/bit-functions

位操作函数 {#wei-cao-zuo-han-shu}

位操作函数适用于UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64,Float32或Float64中的任何类型。

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

bitAnd(a, b) {#bitanda-b}

bitOr(a, b) {#bitora-b}

bitXor(a, b) {#bitxora-b}

bitNot(a) {#bitnota}

bitShiftLeft(a, b) {#bitshiftlefta-b}

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

FixedStringString 被视为单个多字节值。

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

语法

  1. bitShiftLeft(a, b)

参数

返回值

  • 移位后的值。

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

示例

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

  1. SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);
  2. SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
  3. SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);

结果:

  1. ┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐
  2. 99 01100011 140 10001100
  3. └────┴──────────┴───────────┴──────────────────────────┘
  4. ┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐
  5. abc 616263 &0 06162630
  6. └─────┴────────────┴───────────┴─────────────────────────────┘
  7. ┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐
  8. abc 616263 &0 162630
  9. └─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘

bitShiftRight(a, b) {#bitshiftrighta-b}

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

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

语法

  1. bitShiftRight(a, b)

参数

返回值

  • 移位后的值。

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

示例

查询语句:

  1. SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);
  2. SELECT 'abc' AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
  3. SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);

结果:

  1. ┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐
  2. 101 01100101 25 00011001
  3. └─────┴──────────┴───────────┴────────────────────────────┘
  4. ┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐
  5. abc 616263 0616
  6. └─────┴────────────┴───────────┴───────────────────────────────┘
  7. ┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐
  8. abc 616263 000616
  9. └─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘

bitRotateLeft(a, b) {#bitrotatelefta-b}

bitRotateRight(a, b) {#bitrotaterighta-b}

bitSlice(s, offset, length)

返回从offset索引中的length位长的位开始的子字符串,位索引从 1 开始。

语法

  1. bitSlice(s, offset[, length])

参数

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

返回值

  • 子字符串,类型为String

示例

查询语句:

  1. select bin('Hello'), bin(bitSlice('Hello', 1, 8))
  2. select bin('Hello'), bin(bitSlice('Hello', 1, 2))
  3. select bin('Hello'), bin(bitSlice('Hello', 1, 9))
  4. select bin('Hello'), bin(bitSlice('Hello', -4, 8))

结果:

  1. ┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 8))─┐
  2. 0100100001100101011011000110110001101111 01001000
  3. └──────────────────────────────────────────┴──────────────────────────────┘
  4. ┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 2))─┐
  5. 0100100001100101011011000110110001101111 01000000
  6. └──────────────────────────────────────────┴──────────────────────────────┘
  7. ┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 9))─┐
  8. 0100100001100101011011000110110001101111 0100100000000000
  9. └──────────────────────────────────────────┴──────────────────────────────┘
  10. ┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', -4, 8))─┐
  11. 0100100001100101011011000110110001101111 11110000
  12. └──────────────────────────────────────────┴───────────────────────────────┘

bitTest {#bittest}

取任意整数并将其转换为binary form,返回指定位置的位值。位值从右到左数,从0开始计数。

语法

  1. SELECT bitTest(number, index)

参数

  • number – 整数。
  • index – 要获取位值的位置。

返回值

返回指定位置的位值

类型为:UInt8

示例

例如,十进制数字 43 在二进制的表示是 101011。

查询语句:

  1. SELECT bitTest(43, 1);

结果:

  1. ┌─bitTest(43, 1)─┐
  2. 1
  3. └────────────────┘

另一个示例:

查询语句:

  1. SELECT bitTest(43, 2);

结果:

  1. ┌─bitTest(43, 2)─┐
  2. 0
  3. └────────────────┘

bitTestAll {#bittestall}

返回给定位置所有位的 logical conjuction 进行与操作的结果。位值从右到左数,从0开始计数。

与运算的结果:

0 AND 0 = 0

0 AND 1 = 0

1 AND 0 = 0

1 AND 1 = 1

语法

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

参数

  • number – 整数。
  • index1, index2, index3, index4 – 位的位置。例如,对于一组位置 (index1, index2, index3, index4) 当且仅当它的所有位置都为真时才为真 (index1index2, ⋀ index3index4 )。

返回值

返回逻辑与的结果。

类型为: UInt8

示例

例如,十进制数字 43 在二进制的表示是 101011。

查询语句:

  1. SELECT bitTestAll(43, 0, 1, 3, 5);

结果:

  1. ┌─bitTestAll(43, 0, 1, 3, 5)─┐
  2. 1
  3. └────────────────────────────┘

另一个例子:

查询语句:

  1. SELECT bitTestAll(43, 0, 1, 3, 5, 2);

结果:

  1. ┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
  2. 0
  3. └───────────────────────────────┘

bitTestAny {#bittestany}

返回给定位置所有位的 logical disjunction 进行或操作的结果。位值从右到左数,从0开始计数。

或运算的结果:

0 OR 0 = 0

0 OR 1 = 1

1 OR 0 = 1

1 OR 1 = 1

语法

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

参数

  • number – 整数。
  • index1, index2, index3, index4 – 位的位置。

返回值

返回逻辑或的结果。

类型为: UInt8

示例

例如,十进制数字 43 在二进制的表示是 101011。

查询语句:

  1. SELECT bitTestAny(43, 0, 2);

结果:

  1. ┌─bitTestAny(43, 0, 2)─┐
  2. 1
  3. └──────────────────────┘

另一个例子:

查询语句:

  1. SELECT bitTestAny(43, 4, 2);

结果:

  1. ┌─bitTestAny(43, 4, 2)─┐
  2. 0
  3. └──────────────────────┘

bitCount {#bitcount}

计算数字的二进制表示中值为 1 的位数。

语法

  1. bitCount(x)

参数

  • x — 类型为Integerfloating-point数字。该函数使用内存中的值表示。它允许支持浮点数。

返回值

  • 输入数字中值为 1 的位数。

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

类型为: UInt8

示例

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

查询语句:

  1. SELECT bitCount(333);

结果:

  1. ┌─bitCount(333)─┐
  2. 5
  3. └───────────────┘

bitHammingDistance {#bithammingdistance}

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

语法

  1. bitHammingDistance(int1, int2)

参数

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

返回值

  • 汉明距离。

类型为: UInt8

示例

查询语句:

  1. SELECT bitHammingDistance(111, 121);

结果:

  1. ┌─bitHammingDistance(111, 121)─┐
  2. 3
  3. └──────────────────────────────┘

使用SimHash函数:

  1. SELECT bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat'));

结果:

  1. ┌─bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat'))─┐
  2. 5
  3. └──────────────────────────────────────────────────────────────────────────────┘

来源文章