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

bit_count(x, bits) bigint#

Подсчитывает количество битов, установленных в x. Значение x будет рассмотрено как bits-битное целое число со знаком. Функция возвращает ошибку, если количество bits недостаточно для представления значения x:

SELECT bit_count(9, 64); -- 2
SELECT bit_count(9, 8); -- 2
SELECT bit_count(9, 2); -- ERROR: Number must be representable with the bits specified
SELECT bit_count(-1, 64); -- 64
SELECT bit_count(-1, 8); -- 8
bitwise_and(x, y) bigint#

Возвращает побитовое AND для x и y.

Побитовое AND для 19 (10011) и 25 (11001) приводит к 17 (10001):

SELECT bitwise_and(19,25); -- 17
bitwise_not(x) bigint#

Возвращает побитовое NOT для x:

SELECT bitwise_not(-12); --  11
SELECT bitwise_not(19);  -- -20
SELECT bitwise_not(25);  -- -26
bitwise_or(x, y) bigint#

Возвращает побитовое OR для x и y

Побитовое OR 19 (10011) и 25 (11001) приводит к 27 (11011):

SELECT bitwise_or(19,25); -- 27
bitwise_xor(x, y) bigint#

Возвращает побитовое XOR для x и y.

Побитовое XOR для 19 (10011) и 25 (11001) приводит к 10 (01010):

SELECT bitwise_xor(19,25); -- 10
bitwise_left_shift(value, shift) [same as value]#

Сдвигает значение value влево на заданное количество бит shift.

Сдвиг 1 (001) на два бита влево приводит к 4 (00100):

SELECT bitwise_left_shift(1, 2); -- 4

Сдвиг 5 (0101) на два бита влево приводит к 20 (010100):

SELECT bitwise_left_shift(5, 2); -- 20

Сдвиг value на 0 бит влево всегда приводит к исходному value:

SELECT bitwise_left_shift(20, 0); -- 20
SELECT bitwise_left_shift(42, 0); -- 42

Сдвиг 0 на shift бит влево всегда приводит к 0:

SELECT bitwise_left_shift(0, 1); -- 0
SELECT bitwise_left_shift(0, 2); -- 0
bitwise_right_shift(value, shift) [same as value]#

Сдвигает значение value вправо на заданное количество бит shift.

Сдвиг 8 (1000) на три бита вправо приводит к 1 (001):

SELECT bitwise_right_shift(8, 3); -- 1

Сдвиг 9 (1001) на один бит вправо приводит к 4 (100):

SELECT bitwise_right_shift(9, 1); -- 4

Сдвиг value на 0 бит вправо всегда приводит к исходному value:

SELECT bitwise_right_shift(20, 0); -- 20
SELECT bitwise_right_shift(42, 0); -- 42

Сдвиг value на 64 или более бит вправо приводит к 0:

SELECT bitwise_right_shift( 12, 64); -- 0
SELECT bitwise_right_shift(-45, 64); -- 0

Сдвиг 0 на shift бит вправо всегда приводит к 0:

SELECT bitwise_right_shift(0, 1); -- 0
SELECT bitwise_right_shift(0, 2); -- 0
bitwise_right_shift_arithmetic(value, shift) [same as value]#

Арифметически сдвигает значение value вправо на заданное количество бит shift. Данная функция заполняет биты слева значением знакового бита (0 для неотрицательных значений и 1 для отрицательных). Таким образом, функции bitwise_right_shift и bitwise_right_shift_arithmetic всегда возвращают одни и те же значения для неотрицательных чисел, но веду себя по-разному для отрицательных значений:

SELECT bitwise_right_shift(9, 1);                              --   4
SELECT bitwise_right_shift_arithmetic(9, 1);                   --   4
SELECT bitwise_right_shift(cast(-9 as tinyint), 1);            -- 123 (1111 0111 -> 0111 1011)
SELECT bitwise_right_shift_arithmetic(cast(-9 as tinyint), 1); --  -5 (1111 0111 -> 1111 1011)

См. также bitwise_and_agg() и bitwise_or_agg().