Skip to main content

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

Битовые функции работают для любой пары типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64.

Тип результата - целое число, битность которого равна максимальной битности аргументов. Если хотя бы один аргумент знаковый, то результат - знаковое число. Если аргумент - число с плавающей запятой - оно приводится к 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 │
└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘

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 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1

Синтаксис

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

Аргументы

  • number – целое число.
  • index1, index2, index3, index4 – позиция бита. Например, конъюнкция для набора позиций index1, index2, index3, index4 является истинной, если все его позиции истинны index1index2index3index4.

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

Возвращает результат логической конъюнкции.

Тип: 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 OR 0 = 0 0 OR 1 = 1 1 OR 0 = 1 1 OR 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)

Аргументы

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

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

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

Тип: UInt8.

Пример

Возьмём к примеру число 333. Его бинарное представление — 0000000101001101.

Запрос:

SELECT bitCount(333);

Результат:

┌─bitCount(100)─┐
│ 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 │
└──────────────────────────────────────────────────────────────────────────────┘