ClickHouse/docs/ru/sql_reference/functions/bit_functions.md
2020-04-09 21:06:07 +03:00

239 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Битовые функции {#bitovye-funktsii}
Битовые функции работают для любой пары типов из UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64.
Тип результата - целое число, битность которого равна максимальной битности аргументов. Если хотя бы один аргумент знаковый, то результат - знаковое число. Если аргумент - число с плавающей запятой - оно приводится к Int64.
## bitAnd(a, b) {#bitanda-b}
## bitOr(a, b) {#bitora-b}
## bitXor(a, b) {#bitxora-b}
## bitNot(a) {#bitnota}
## bitShiftLeft(a, b) {#bitshiftlefta-b}
## bitShiftRight(a, b) {#bitshiftrighta-b}
## bitTest {#bittest}
Принимает любое целое число и конвертирует его в [двоичное число](https://en.wikipedia.org/wiki/Binary_number), возвращает значение бита в указанной позиции. Отсчет начинается с 0 справа налево.
**Синтаксис**
``` sql
SELECT bitTest(number, index)
```
**Параметры**
- `number` целое число.
- `index` position of bit.
**Возвращаемое значение**
Возвращает значение бита в указанной позиции.
Тип: `UInt8`.
**Пример**
Например, число 43 в двоичной системе счисления равно: 101011.
Запрос:
``` sql
SELECT bitTest(43, 1)
```
Ответ:
``` text
┌─bitTest(43, 1)─┐
│ 1 │
└────────────────┘
```
Другой пример:
Запрос:
``` sql
SELECT bitTest(43, 2)
```
Ответ:
``` text
┌─bitTest(43, 2)─┐
│ 0 │
└────────────────┘
```
## bitTestAll {#bittestall}
Возвращает результат [логической конъюнкции](https://en.wikipedia.org/wiki/Logical_conjunction) (оператор AND) всех битов в указанных позициях. Отсчет начинается с 0 справа налево.
Бинарная конъюнкция:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
**Синтаксис**
``` sql
SELECT bitTestAll(number, index1, index2, index3, index4, ...)
```
**Параметры**
- `number` целое число.
- `index1`, `index2`, `index3`, `index4` позиция бита. Например, конъюнкция для набора позиций `index1`, `index2`, `index3`, `index4` является истинной, если все его позиции истинны `index1``index2``index3``index4`.
**Возвращаемое значение**
Возвращает результат логической конъюнкции.
Тип: `UInt8`.
**Пример**
Например, число 43 в двоичной системе счисления равно: 101011.
Запрос:
``` sql
SELECT bitTestAll(43, 0, 1, 3, 5)
```
Ответ:
``` text
┌─bitTestAll(43, 0, 1, 3, 5)─┐
│ 1 │
└────────────────────────────┘
```
Другой пример:
Запрос:
``` sql
SELECT bitTestAll(43, 0, 1, 3, 5, 2)
```
Ответ:
``` text
┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│ 0 │
└───────────────────────────────┘
```
## bitTestAny {#bittestany}
Возвращает результат [логической дизъюнкции](https://en.wikipedia.org/wiki/Logical_disjunction) (оператор OR) всех битов в указанных позициях. Отсчет начинается с 0 справа налево.
Бинарная дизъюнкция:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
**Синтаксис**
``` sql
SELECT bitTestAny(number, index1, index2, index3, index4, ...)
```
**Параметры**
- `number` целое число.
- `index1`, `index2`, `index3`, `index4` позиции бита.
**Возвращаемое значение**
Возвращает результат логической дизъюнкции.
Тип: `UInt8`.
**Пример**
Например, число 43 в двоичной системе счисления равно: 101011.
Запрос:
``` sql
SELECT bitTestAny(43, 0, 2)
```
Ответ:
``` text
┌─bitTestAny(43, 0, 2)─┐
│ 1 │
└──────────────────────┘
```
Другой пример:
Запрос:
``` sql
SELECT bitTestAny(43, 4, 2)
```
Ответ:
``` text
┌─bitTestAny(43, 4, 2)─┐
│ 0 │
└──────────────────────┘
```
## bitCount {#bitcount}
Подсчитывает количество равных единице бит в числе.
**Синтаксис**
```sql
bitCount(x)
```
**Параметры**
- `x` — [Целое число](../../sql_reference/functions/bit_functions.md) или [число с плавающей запятой](../../sql_reference/functions/bit_functions.md). Функция использует представление числа в памяти, что позволяет поддержать числа с плавающей запятой.
**Возвращаемое значение**
- Количество равных единице бит во входном числе.
Функция не преобразует входное значение в более крупный тип ([sign extension](https://en.wikipedia.org/wiki/Sign_extension)). Поэтому, например, `bitCount(toUInt8(-1)) = 8`.
Тип: `UInt8`.
**Пример**
Возьмём к примеру число 333. Его бинарное представление — 0000000101001101.
Запрос:
```sql
SELECT bitCount(333)
```
Результат:
```text
┌─bitCount(100)─┐
│ 5 │
└───────────────┘
```
[Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/functions/bit_functions/) <!--hide-->