Битовые функции
Битовые функции работают с любой парой типов из UInt8
, UInt16
, UInt32
, UInt64
, Int8
, Int16
, Int32
, Int64
, Float32
или Float64
. Некоторые функции поддерживают типы String
и FixedString
.
Тип результата — целое число с битами, равными максимальному количеству битов его аргументов. Если хотя бы один из аргументов имеет знаковый тип, то результат будет знаковым числом. Если аргумент — число с плавающей запятой, оно будет преобразовано в Int64.
bitAnd(a, b)
bitOr(a, b)
bitXor(a, b)
bitNot(a)
bitShiftLeft(a, b)
Сдвигает бинарное представление значения влево на заданное количество битовых позиций.
FixedString
или String
рассматриваются как одно многобайтовое значение.
Биты значения FixedString
теряются при сдвиге. В то время как значение String
продлевается дополнительными байтами, поэтому никакие биты не теряются.
Синтаксис
Аргументы
a
— Значение, которое нужно сдвинуть. Целые типы, String или FixedString.b
— Количество позиций сдвига. Разрешены Беззнаковые целые типы, типы размером 64 бита или меньше.
Возвращаемое значение
- Сдвинутое значение.
Тип возвращаемого значения такой же, как тип входного значения.
Пример
В следующих запросах используются функции bin и hex для отображения битов сдвинутых значений.
Результат:
bitShiftRight(a, b)
Сдвигает бинарное представление значения вправо на заданное количество битовых позиций.
FixedString
или String
рассматриваются как одно многобайтовое значение. Обратите внимание, что длина значения String
уменьшается по мере сдвига битов.
Синтаксис
Аргументы
a
— Значение, которое нужно сдвинуть. Целые типы, String или FixedString.b
— Количество позиций сдвига. Разрешены Беззнаковые целые типы, типы размером 64 бита или меньше.
Возвращаемое значение
- Сдвинутое значение.
Тип возвращаемого значения такой же, как тип входного значения.
Пример
Запрос:
Результат:
bitRotateLeft(a, b)
bitRotateRight(a, b)
bitSlice(s, offset, length)
Возвращает подстроку, начиная с бита по индексу 'offset' длиной 'length' бит. Индексация битов начинается с 1.
Синтаксис
Аргументы
s
— s — это String или FixedString.offset
— Начальный индекс бита, положительное значение указывает на смещение слева, а отрицательное значение — на смещение справа. Нумерация битов начинается с 1.length
— Длина подстроки с битом. Если вы укажете отрицательное значение, функция вернет открытую подстроку [offset, array_length - length]. Если значение опущено, функция вернет подстроку [offset, the_end_string]. Если длина превышает s, она будет обрезана. Если длина не является кратной 8, будет добавлено 0 справа.
Возвращаемое значение
- Подстрока. String
Пример
Запрос:
Результат:
byteSlice(s, offset, length)
См. функцию substring.
bitTest
Принимает любое целое число и преобразует его в двойную систему счисления, возвращает значение бита на заданной позиции. Нумерация производится справа налево, начиная с 0.
Синтаксис
Аргументы
number
– Целое число.index
– Позиция бита.
Возвращаемое значение
- Значение бита на указанной позиции. UInt8.
Пример
Например, число 43 в двоичной системе (бинарной) представляется как 101011.
Запрос:
Результат:
Другой пример:
Запрос:
Результат:
bitTestAll
Возвращает результат логического соединения (логическая операция И) всех битов на заданных позициях. Нумерация производится справа налево, начиная с 0.
Существуют следующие правила для побитовых операций:
0 И 0 = 0
0 И 1 = 0
1 И 0 = 0
1 И 1 = 1
Синтаксис
Аргументы
number
– Целое число.index1
,index2
,index3
,index4
– Позиции битов. Например, для набора позиций (index1
,index2
,index3
,index4
) результат будет истинным только в том случае, если все его позиции истинны (index1
⋀index2
, ⋀index3
⋀index4
).
Возвращаемое значение
- Результат логического conjunction. UInt8.
Пример
Например, число 43 в двоичной системе (бинарной) представляется как 101011.
Запрос:
Результат:
Другой пример:
Запрос:
Результат:
bitTestAny
Возвращает результат логического сложения (логическая операция ИЛИ) всех битов на заданных позициях. Нумерация производится справа налево, начиная с 0.
Существуют следующие правила для побитовых операций:
0 ИЛИ 0 = 0
0 ИЛИ 1 = 1
1 ИЛИ 0 = 1
1 ИЛИ 1 = 1
Синтаксис
Аргументы
number
– Целое число.index1
,index2
,index3
,index4
– Позиции битов.
Возвращаемое значение
- Результат логического сложения. UInt8.
Пример
Например, число 43 в двоичной системе (бинарной) представляется как 101011.
Запрос:
Результат:
Другой пример:
Запрос:
Результат:
bitCount
Подсчитывает количество бит, установленных в единицу в бинарном представлении числа.
Синтаксис
Аргументы
x
— Целое или число с плавающей запятой. Функция использует представление значения в памяти. Это позволяет поддерживать числа с плавающей запятой.
Возвращаемое значение
- Количество бит, установленных в единицу в входном числе. UInt8.
Функция не преобразует входное значение в более крупный тип (сохранение знака). Поэтому, например, bitCount(toUInt8(-1)) = 8
.
Пример
Например, число 333. Его бинарное представление: 0000000101001101.
Запрос:
Результат:
bitHammingDistance
Возвращает расстояние Хэмминга между битовыми представлениями двух целых значений. Может быть использовано с функциями SimHash для обнаружения полудубликатов строк. Чем меньше расстояние, тем более вероятно, что эти строки одинаковые.
Синтаксис
Аргументы
Возвращаемое значение
- Расстояние Хэмминга. UInt8.
Примеры
Запрос:
Результат:
С функцией SimHash:
Результат: