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

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

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

Тип результата - это целое число с битами, равными максимальному количеству битов его аргументов. Если хотя бы один из аргументов знаковый, результат будет знаковым числом. Если аргумент является числом с плавающей запятой, он приводится к Int64.

bitAnd

Введено в: v1.1

Выполняет побитовую операцию AND между двумя значениями.

Синтаксис

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

Вычисляет количество битов, установленных в единицу в двоичном representation числа.

Синтаксис

bitCount(x)

Аргументы

  • x — Целое или дробное значение. (U)Int* или Float*

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

Возвращает количество битов, установленных в единицу в x. UInt8.

примечание

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

Примеры

Пример использования

SELECT bin(333), bitCount(333);
┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │             5 │
└──────────────────┴───────────────┘

bitHammingDistance

Введено в: v21.1

Возвращает расстояние Хэмминга между битовыми представлениями двух чисел. Может использоваться с функциями 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

Выполняет побитовую операцию NOT.

Синтаксис

bitNot(a)

Аргументы

  • a — Значение, для которого применяется побитовая операция NOT. (U)Int* или Float* или String

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

Возвращает результат ~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

Выполняет побитовую операцию 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

Сдвигает биты влево на определенное количество позиций. Биты, которые выходят за пределы, оборачиваются вправо.

Синтаксис

bitRotateLeft(a, N)

Аргументы

  • a — Значение, которое нужно вращать. (U)Int8/16/32/64
  • N — Количество позиций для вращения влево. 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

Сдвигает биты вправо на определенное количество позиций. Биты, которые выходят за пределы, оборачиваются влево.

Синтаксис

bitRotateRight(a, N)

Аргументы

  • a — Значение, которое нужно вращать. (U)Int8/16/32/64
  • N — Количество позиций для вращения вправо. 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

Сдвигает двоичное представление значения влево на заданное количество битовых позиций.

FixedString или String рассматриваются как одно многобайтовое значение.

Биты значения FixedString теряются при сдвиге. С другой стороны, значение String дополняется дополнительными байтами, поэтому битов не теряется.

Синтаксис

bitShiftLeft(a, N)

Аргументы

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

Возвращает смещенное значение с типом, равным типу a.

Примеры

Пример использования с двоичным кодированием

SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);
┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐
│ 99 │ 01100011 │       140 │ 10001100                 │
└────┴──────────┴───────────┴──────────────────────────┘

Пример использования с шестнадцатеричным кодированием

SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐
│ abc │ 616263     │ &0        │ 06162630                    │
└─────┴────────────┴───────────┴─────────────────────────────┘

Пример использования с кодированием Fixed String

SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐
│ abc │ 616263                       │ &0        │ 162630                                        │
└─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘

bitShiftRight

Введено в: v1.1

Сдвигает двоичное представление значения вправо на заданное количество битовых позиций.

FixedString или String рассматриваются как одно многобайтовое значение.

Биты значения FixedString теряются при сдвиге. С другой стороны, значение String дополняется дополнительными байтами, поэтому битов не теряется.

Синтаксис

bitShiftRight(a, N)

Аргументы

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

Возвращает смещенное значение с типом, равным типу a.

Примеры

Пример использования с двоичным кодированием

SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);
┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐
│ 101 │ 01100101 │        25 │ 00011001                   │
└─────┴──────────┴───────────┴────────────────────────────┘

Пример использования с шестнадцатеричным кодированием

SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐
│ abc │ 616263     │           │ 0616                          │
└─────┴────────────┴───────────┴───────────────────────────────┘

Пример использования с кодированием Fixed String

SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐
│ abc │ 616263                       │           │ 000616                                          │
└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘

bitSlice

Введено в: v22.2

Возвращает подстроку, начиная с бита с индекса 'offset', длина которой составляет 'length' бит.

Синтаксис

bitSlice(s, offset[, length])

Аргументы

  • s — Строка или Fixed String для нарезки. String или FixedString

  • offset — Возвращает начальную позицию бита (индексация с 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.

Синтаксис

bitTest(a, i)

Аргументы

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

Возвращает значение бита в позиции i в двоичном представлении a UInt8

Примеры

Пример использования

SELECT bin(2), bitTest(2, 1);
┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │             1 │
└──────────┴───────────────┘

bitTestAll

Введено в: v1.1

Возвращает результат логического конъюнкции (оператор AND) всех битов в заданных позициях. Счёт ведётся справа налево, начиная с 0.

Логическое И между двумя битами истинно, если и только если оба входных бита истинны.

Синтаксис

bitTestAll(a, index1[, index2, ... , indexN])

Аргументы

  • a — Целочисленное значение. (U)Int8/16/32/64
  • index1, ... — Одна или несколько позиций битов. (U)Int8/16/32/64

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

Возвращает результат логического умножения UInt8

Примеры

Пример использования 1

SELECT bitTestAll(43, 0, 1, 3, 5);
┌─bin(43)──┬─bitTestAll(43, 0, 1, 3, 5)─┐
│ 00101011 │                          1 │
└──────────┴────────────────────────────┘

Пример использования 2

SELECT bitTestAll(43, 0, 1, 3, 5, 2);
┌─bin(43)──┬─bitTestAll(4⋯1, 3, 5, 2)─┐
│ 00101011 │                        0 │
└──────────┴──────────────────────────┘

bitTestAny

Введено в: v1.1

Возвращает результат логической дизъюнкции (оператор OR) всех битов в заданных позициях числа. Счёт ведётся справа налево, начиная с 0.

Логическое ИЛИ между двумя битами истинно, если хотя бы один из входных битов истинен.

Синтаксис

bitTestAny(a, index1[, index2, ... , indexN])

Аргументы

  • a — Целочисленное значение. (U)Int8/16/32/64
  • index1, ... — Одна или несколько позиций битов. (U)Int8/16/32/64

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

Возвращает результат логической суммы UInt8

Примеры

Пример использования 1

SELECT bitTestAny(43, 0, 2);
┌─bin(43)──┬─bitTestAny(43, 0, 2)─┐
│ 00101011 │                    1 │
└──────────┴──────────────────────┘

Пример использования 2

SELECT bitTestAny(43, 4, 2);
┌─bin(43)──┬─bitTestAny(43, 4, 2)─┐
│ 00101011 │                    0 │
└──────────┴──────────────────────┘

bitXor

Введено в: v1.1

Выполняет побитовую операцию исключающее ИЛИ (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 │
└───┴───┴──────────────┘