Побитовые функции#
- 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()
.