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

Битовые функции работают для любой пары типов из 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)

## bitShiftRight(a, 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 │
└──────────────────────┘
```

[Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/functions/bit_functions/) <!--hide-->