Перейти к основному содержимому
Перейти к основному содержимому

Битовые функции

Битовые функции работают с любой парой типов из 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)

Аргументы

Возвращаемое значение

  • Сдвинутое значение.

Тип возвращаемого значения такой же, как тип входного значения.

Пример

В следующих запросах используются функции 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)

Аргументы

Возвращаемое значение

  • Сдвинутое значение.

Тип возвращаемого значения такой же, как тип входного значения.

Пример

Запрос:

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]. Если длина превышает s, она будет обрезана. Если длина не является кратной 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 в двоичной системе (бинарной) представляется как 101011.

Запрос:

SELECT bitTest(43, 1);

Результат:

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

Другой пример:

Запрос:

SELECT bitTest(43, 2);

Результат:

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

bitTestAll

Возвращает результат логического соединения (логическая операция И) всех битов на заданных позициях. Нумерация производится справа налево, начиная с 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) результат будет истинным только в том случае, если все его позиции истинны (index1index2, ⋀ index3index4).

Возвращаемое значение

  • Результат логического conjunction. 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

Возвращает результат логического сложения (логическая операция ИЛИ) всех битов на заданных позициях. Нумерация производится справа налево, начиная с 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

Подсчитывает количество бит, установленных в единицу в бинарном представлении числа.

Синтаксис

bitCount(x)

Аргументы

Возвращаемое значение

  • Количество бит, установленных в единицу в входном числе. UInt8.
примечание

Функция не преобразует входное значение в более крупный тип (сохранение знака). Поэтому, например, bitCount(toUInt8(-1)) = 8.

Пример

Например, число 333. Его бинарное представление: 0000000101001101.

Запрос:

SELECT bitCount(333);

Результат:

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

bitHammingDistance

Возвращает расстояние Хэмминга между битовыми представлениями двух целых значений. Может быть использовано с функциями SimHash для обнаружения полудубликатов строк. Чем меньше расстояние, тем более вероятно, что эти строки одинаковые.

Синтаксис

bitHammingDistance(int1, int2)

Аргументы

  • int1 — Первое целое значение. Int64.
  • int2 — Второе целое значение. Int64.

Возвращаемое значение

  • Расстояние Хэмминга. 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 │
└──────────────────────────────────────────────────────────────────────────────┘