8.4 KiB
toc_priority | toc_title |
---|---|
48 | Битовые функции |
Битовые функции
Битовые функции работают для любой пары типов из 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)
bitShiftRight(a, b)
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
является истинной, если все его позиции истинны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 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)
Аргументы
x
— целое число или число с плавающей запятой. Функция использует представление числа в памяти, что позволяет поддержать числа с плавающей запятой.
Возвращаемое значение
- Количество равных единице бит во входном числе.
Функция не преобразует входное значение в более крупный тип (sign extension). Поэтому, например, bitCount(toUInt8(-1)) = 8
.
Тип: UInt8
.
Пример
Возьмём к примеру число 333. Его бинарное представление — 0000000101001101.
Запрос:
SELECT bitCount(333);
Результат:
┌─bitCount(100)─┐
│ 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 │
└──────────────────────────────────────────────────────────────────────────────┘