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

bit_count(x, bits) bigint#

Подсчитывает количество установленных битов в x (рассматривается как знаковое целое длиной bits бит) в представлении с дополнением до двух:

SELECT bit_count(9, 64); -- 2
SELECT bit_count(9, 8); -- 2
SELECT bit_count(-7, 64); -- 62
SELECT bit_count(-7, 8); -- 6
bitwise_and(x, y) bigint#

Возвращает побитовое AND для x и y в представлении с дополнением до двух.

Побитовое AND 19 (binary: 10011) и 25 (binary: 11001) дает 17 (binary: 10001):

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

Возвращает побитовое NOT для x в представлении с дополнением до двух (NOT x = -x - 1):

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 (binary: 10011) и 25 (binary: 11001) дает 27 (binary: 11011):

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

Возвращает побитовое XOR для x и y в представлении с дополнением до двух.

Побитовое XOR 19 (binary: 10011) и 25 (binary: 11001) дает 10 (binary: 01010):

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

Возвращает значение value, сдвинутое влево.

Сдвиг 1 (binary: 001) на два бита дает 4 (binary: 00100):

SELECT bitwise_left_shift(1, 2); -- 4

Сдвиг 5 (binary: 0101) на два бита дает 20 (binary: 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, логически сдвинутое вправо.

Сдвиг 8 (binary: 1000) на три бита дает 1 (binary: 001):

SELECT bitwise_right_shift(8, 3); -- 1

Сдвиг 9 (binary: 1001) на один бит дает 4 (binary: 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, арифметически сдвинутое вправо.

Возвращает те же значения, что и bitwise_right_shift(), при сдвиге менее чем на 64 бита. Сдвиг на 64 и более бит дает 0 для положительного и -1 для отрицательного value:

SELECT bitwise_right_shift_arithmetic( 12, 64); --  0
SELECT bitwise_right_shift_arithmetic(-45, 64); -- -1

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