Битовые функции работают с любой парой типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32 или Float64. Некоторые функции также поддерживают типы String и FixedString.
Тип результата — целое число с количеством битов, равным максимальному количеству битов среди аргументов. Если хотя бы один из аргументов является знаковым, результат тоже будет знаковым числом. Если аргумент является числом с плавающей запятой, он приводится к Int64.
bitAnd
Добавленный в: v1.1.0
Выполняет операцию побитового И над двумя значениями.
Синтаксис
bitAnd(a, b)Аргументы
Возвращаемое значение
Возвращает результат побитовой операции a AND b
Примеры
Пример использования
CREATE TABLE bits
(
`a` UInt8,
`b` UInt8
)
ENGINE = Memory;
INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);
SELECT
a,
b,
bitAnd(a, b)
FROM bits┌─a─┬─b─┬─bitAnd(a, b)─┐
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 0 │
│ 1 │ 0 │ 0 │
│ 1 │ 1 │ 1 │
└───┴───┴──────────────┘bitCount
Добавленный в: v20.3.0
Вычисляет количество битов, равных единице, в двоичном представлении числа.
Синтаксис
bitCount(x)Аргументы
Возвращаемое значение
Возвращает количество битов в x, установленных в единицу. UInt8.
Примеры
Пример использования
SELECT bin(333), bitCount(333);┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │ 5 │
└──────────────────┴───────────────┘bitHammingDistance
Добавленный в: v21.1.0
Возвращает расстояние Хэмминга между битовыми представлениями двух чисел.
Может использоваться с функциями SimHash для обнаружения почти дублирующихся строк.
Чем меньше расстояние, тем больше они похожи друг на друга.
Синтаксис
bitHammingDistance(x, y)Аргументы
x— Первое число для вычисления расстояния Хэмминга.(U)Int*илиFloat*y— Второе число для вычисления расстояния Хэмминга.(U)Int*илиFloat*
Возвращаемое значение
Возвращает расстояние Хэмминга между x и y. UInt8
Примеры
Пример использования
SELECT bitHammingDistance(111, 121);┌─bitHammingDistance(111, 121)─┐
│ 3 │
└──────────────────────────────┘bitNot
Добавленный в: v1.1.0
Выполняет побитовую операцию НЕ.
Синтаксис
bitNot(a)Аргументы
Возвращаемое значение
Возвращает результат ~a, то есть a с инвертированными битами.
Примеры
Пример использования
SELECT
CAST('5', 'UInt8') AS original,
bin(original) AS original_binary,
bitNot(original) AS result,
bin(bitNot(original)) AS result_binary;┌─original─┬─original_binary─┬─result─┬─result_binary─┐
│ 5 │ 00000101 │ 250 │ 11111010 │
└──────────┴─────────────────┴────────┴───────────────┘bitOr
Добавленный в: v1.1.0
Выполняет побитовую операцию OR над двумя значениями.
Синтаксис
bitOr(a, b)Аргументы
Возвращаемое значение
Возвращает результат побитовой операции a OR b
Примеры
Пример использования
CREATE TABLE bits
(
`a` UInt8,
`b` UInt8
)
ENGINE = Memory;
INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);
SELECT
a,
b,
bitOr(a, b)
FROM bits;┌─a─┬─b─┬─bitOr(a, b)─┐
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 1 │
└───┴───┴─────────────┘bitRotateLeft
Добавленный в: v1.1.0
Циклически сдвигает биты влево на заданное число позиций. Биты, выходящие за пределы, переносятся на правую сторону.
Синтаксис
bitRotateLeft(a, N)Аргументы
a— Значение, которое нужно циклически сдвинуть.(U)Int8/16/32/64N— Количество позиций для циклического сдвига влево.UInt8/16/32/64
Возвращаемое значение
Возвращает значение после циклического сдвига; тип результата совпадает с типом a. (U)Int8/16/32/64
Примеры
Пример использования
SELECT 99 AS a, bin(a), bitRotateLeft(a, 2) AS a_rotated, bin(a_rotated);┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │ 141 │ 10001101 │
└────┴──────────┴───────────┴────────────────┘bitRotateRight
Добавленный в: v1.1.0
Циклически сдвигает биты вправо на заданное число позиций. Биты, выходящие за пределы справа, переносятся влево.
Синтаксис
bitRotateRight(a, N)Аргументы
a— Значение для циклического сдвига.(U)Int8/16/32/64N— Количество позиций для циклического сдвига вправо.UInt8/16/32/64
Возвращаемое значение
Возвращает значение после циклического сдвига; тип совпадает с типом a. (U)Int8/16/32/64
Примеры
Пример использования
SELECT 99 AS a, bin(a), bitRotateRight(a, 2) AS a_rotated, bin(a_rotated);┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │ 216 │ 11011000 │
└────┴──────────┴───────────┴────────────────┘bitShiftLeft
Добавленный в: v1.1.0
Сдвигает двоичное представление значения влево на указанное число битовых позиций.
FixedString или String рассматривается как единое многобайтовое значение.
Биты значения FixedString теряются при сдвиге за его пределы.
Напротив, значение String дополняется дополнительными байтами, поэтому биты не теряются.
Синтаксис
bitShiftLeft(a, N)Аргументы
a— значение, которое нужно сдвинуть.(U)Int*илиStringилиFixedStringN— число позиций сдвига.UInt8/16/32/64
Возвращаемое значение
Возвращает сдвинутое значение того же типа, что и a.
Примеры
Пример использования с двоичным кодированием
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);┌──a─┬─bin(a)───┬─a_shifted─┬─bin(a_shifted)─┐
│ 99 │ 01100011 │ 140 │ 10001100 │
└────┴──────────┴───────────┴────────────────┘Пример использования с шестнадцатеричным кодированием
-- The shifted value is binary, so it is shown with `hex`.
SELECT 'abc' AS a, hex(a), hex(bitShiftLeft(a, 4)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 06162630 │
└─────┴────────┴───────────┘Пример использования с кодировкой Fixed String
SELECT toFixedString('abc', 3) AS a, hex(a), hex(bitShiftLeft(a, 4)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 162630 │
└─────┴────────┴───────────┘bitShiftRight
Добавленный в: v1.1.0
Сдвигает двоичное представление значения вправо на указанное количество битовых позиций.
FixedString или String рассматривается как одно многобайтовое значение.
Биты значения FixedString теряются по мере их сдвига за пределы строки.
Напротив, значение String расширяется дополнительными байтами, поэтому биты не теряются.
Синтаксис
bitShiftRight(a, N)Аргументы
a— Значение, для которого выполняется сдвиг.(U)Int*илиStringилиFixedStringN— Число позиций сдвига.UInt8/16/32/64
Возвращаемое значение
Возвращает значение после сдвига; его тип совпадает с типом a.
Примеры
Пример использования с двоичным кодированием
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);┌───a─┬─bin(a)───┬─a_shifted─┬─bin(a_shifted)─┐
│ 101 │ 01100101 │ 25 │ 00011001 │
└─────┴──────────┴───────────┴────────────────┘Пример использования в шестнадцатеричном кодировании
-- The shifted value is binary, so it is shown with `hex`.
SELECT 'abc' AS a, hex(a), hex(bitShiftRight(a, 12)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 0616 │
└─────┴────────┴───────────┘Пример использования с кодировкой Fixed String
SELECT toFixedString('abc', 3) AS a, hex(a), hex(bitShiftRight(a, 12)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 000616 │
└─────┴────────┴───────────┘bitSlice
Добавленный в: v22.2.0
Возвращает подстроку длиной 'length' бит, начиная с бита с индексом 'offset'.
Синтаксис
bitSlice(s, offset[, length])Аргументы
s— СтрокаStringилиFixedString, из которой извлекается срез.StringилиFixedStringoffset— Задает начальную позицию бита (индексация начинается с 1).- Положительные значения: отсчет от начала строки.
- Отрицательные значения: отсчет от конца строки.
(U)Int8/16/32/64илиFloat* length— Необязательный параметр. Количество битов для извлечения.- Положительные значения: извлекаются
lengthбитов. - Отрицательные значения: извлечение выполняется от смещения до
(string_length - |length|). - Не указано: извлечение выполняется от смещения до конца строки.
- Если длина не кратна 8, результат дополняется нулями справа.
(U)Int8/16/32/64илиFloat*
Возвращаемое значение
Строка, содержащая извлеченные биты, представленные в виде двоичной последовательности. Результат всегда дополняется до границ байта (кратных 8 битам). String
Примеры
Пример использования
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 │
└──────────────────────────────────────────┴───────────────────────────────┘bitTest
Добавленный в: v1.1.0
Принимает любое число и преобразует его в двоичное представление, затем возвращает значение бита в указанной позиции. Отсчёт ведётся справа налево, начиная с 0.
Синтаксис
bitTest(a, i)Аргументы
a— Число для преобразования.(U)Int8/16/32/64илиFloat*i— Позиция возвращаемого бита.(U)Int8/16/32/64илиFloat*
Возвращаемое значение
Возвращает значение бита в позиции i в двоичном представлении a: UInt8
Примеры
Пример использования
SELECT bin(2), bitTest(2, 1);┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │ 1 │
└──────────┴───────────────┘bitTestAll
Добавленный в: v1.1.0
Возвращает результат логического И (оператор AND) для всех битов в указанных позициях. Отсчёт идёт справа налево, начиная с 0.
Логическое И между двумя битами истинно тогда и только тогда, когда оба входных бита истинны.
Синтаксис
bitTestAll(a, index1[, index2, ... , indexN])Аргументы
a— Целочисленное значение.(U)Int8/16/32/64index1, ...— Одна или несколько битовых позиций.(U)Int8/16/32/64
Возвращаемое значение
Возвращает результат логической конъюнкции типа UInt8
Примеры
Пример использования 1
SELECT bitTestAll(43, 0, 1, 3, 5);┌─bitTestAll(43, 0, 1, 3, 5)─┐
│ 1 │
└────────────────────────────┘Пример использования 2
SELECT bitTestAll(43, 0, 1, 3, 5, 2);┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│ 0 │
└───────────────────────────────┘bitTestAny
Добавленный в: v1.1.0
Возвращает результат логической дизъюнкции (оператор OR) всех битов на указанных позициях в числе. Отсчёт идёт справа налево, начиная с 0.
Логический OR двух битов равен true, если хотя бы один из входных битов равен true.
Синтаксис
bitTestAny(a, index1[, index2, ... , indexN])Аргументы
a— Целочисленное значение.(U)Int8/16/32/64index1, ...— Одна или несколько позиций битов.(U)Int8/16/32/64
Возвращаемое значение
Возвращает результат логической дизъюнкции типа UInt8
Примеры
Пример использования 1
SELECT bitTestAny(43, 0, 2);┌─bitTestAny(43, 0, 2)─┐
│ 1 │
└──────────────────────┘Пример использования 2
SELECT bitTestAny(43, 4, 2);┌─bitTestAny(43, 4, 2)─┐
│ 0 │
└──────────────────────┘bitXor
Добавленный в: v1.1.0
Выполняет операцию побитового исключающего ИЛИ (XOR) над двумя значениями.
Синтаксис
bitXor(a, b)Аргументы
Возвращаемое значение
Результат побитовой операции a XOR b
Примеры
Пример использования
CREATE TABLE bits
(
`a` UInt8,
`b` UInt8
)
ENGINE = Memory;
INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);
SELECT
a,
b,
bitXor(a, b)
FROM bits;┌─a─┬─b─┬─bitXor(a, b)─┐
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 0 │
└───┴───┴──────────────┘