Co-authored-by: gyuton <40863448+gyuton@users.noreply.github.com>
14 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)
Сдвигает влево на заданное количество битов бинарное представление значения.
Если передан аргумент типа FixedString
или String
, то он рассматривается, как одно многобайтовое значение.
Биты FixedString
теряются по мере того, как выдвигаются за пределы строки. Значение String
дополняется байтами, поэтому его биты не теряются.
Синтаксис
bitShiftLeft(a, b)
Аргументы
a
— сдвигаемое значение. Целое число, String или FixedString.b
— величина сдвига. Беззнаковое целое число, допустимы типы с разрядностью не более 64 битов.
Возвращаемое значение
- Сдвинутое значение.
Тип совпадает с типом сдвигаемого значения.
Пример
В запросах используются функции 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)
Аргументы
a
— сдвигаемое значение. Целое число, String или FixedString.b
— величина сдвига. Беззнаковое целое число, допустимы типы с разрядностью не более 64 битов.
Возвращаемое значение
- Сдвинутое значение.
Тип совпадает с типом сдвигаемого значения.
Пример
Запрос:
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
является истинной, если все его позиции истинны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 │
└──────────────────────────────────────────────────────────────────────────────┘