Функции и операторы для битовых строк

В этом разделе описываются функции и операторы для проверки и обработки битовых строк, то есть значений типов bit и bit varying. (Хотя в этих таблицах упоминается только тип bit, вместо них можно использовать значения типа bit varying) Битовые строки поддерживают обычные операторы сравнения, показанные в таблице Операторы сравнения, а также операторы, перечисленные в Таблице 14.

Таблица 14. Операторы для битовых строк

Оператор
Описание
Пример(ы)
bit || bit → bit
Конкатенация
B'10001' || B'011' → 10001011
bit & bit → bit
Побитовое И (операнды должны быть одинаковой длины)
B'10001' & B'01101' → 00001
bit | bit → bit
Побитовое ИЛИ (операнды должны быть одинаковой длины)
B'10001' | B'01101' → 11101
bit # bit → bit
Побитовое исключающее ИЛИ (операнды должны быть одинаковой длины)
B'10001' # B'01101' → 11100
~ bit → bit
Побитовое НЕ
~ B'10001' → 01110
bit << integer → bit
Битовый сдвиг влево (с сохранением длины строки)
B'10001' << 3 → 01000
bit >> integer → bit
Битовый сдвиг вправо (с сохранением длины строки)
B'10001' >> 2 → 00100

Некоторые из функций, имеющихся для двоичных строк, работают также и с битовыми строками, как показано в Таблице 15.

Таблица 15. Функции для битовых строк

Функция
Описание
Пример(ы)
bit_count ( bit ) → bigint
Возвращает количество установленных битов (единиц) в битовой строке (эта операция также известна как «popcount»).
bit_count(B'10111') → 4
bit_length ( bit ) → integer
Возвращает количество битов в битовой строке.
bit_length(B'10111') → 5
length ( bit ) → integer
Возвращает количество битов в битовой строке.
length(B'10111') → 5
octet_length ( bit ) → integer
Возвращает количество байтов в битовой строке.
octet_length(B'1011111011') → 2
overlay ( битовая_строка bit PLACING новая_подстрока bit FROM начало integer [ FOR число integer ] ) → bit
Заменяет в битовой_строке подстроку, начинающуюся с бита на позиции начало и длиной в заданное число бит, на новую_подстроку. Если число опущено, по умолчанию количество заменяемых битов определяется длиной новой_подстроки.
overlay(B'01010101010101010' placing B'11111' from 2 for 3) → 0111110101010101010
position ( подстрока bit IN битовая_строка bit ) → integer
Возвращает начальную позицию первого вхождения подстроки в битовой_строке или ноль, если такого вхождения нет.
position(B'010' in B'000001101011') → 8
substring ( битовая_строка bit [ FROM начало integer ] [ FOR число integer ] ) → bit
Извлекает из битовой_строки подстроку, начиная с бита на позиции начало (если таковая указана), и останавливаясь после заданного числа бит, если оно указано. Должен присутствовать хотя бы один из параметров: начало или число.
substring(B'110010111111' from 3 for 2) → 00
get_bit ( битовая_строка bit, n integer ) → integer
Извлекает из битовой строки n-й бит; первый (самый левый) бит имеет номер 0.
get_bit(B'101010101010101010', 6) → 1
set_bit ( битовая_строка bit, n integer, новое_значение integer ) → bit
Устанавливает для n-го бита в битовой строке новое_значение; первый (самый левый) бит имеет номер 0.
set_bit(B'101010101010101010', 6, 0) → 101010001010101010

Кроме того, в тип bit и обратно можно преобразовывать целочисленные значения. Приведение целого числа к типу bit(n) копирует в него n самых правых бит. Когда целое число приводится к битовой строке с большей длиной, чем размер самого целого, результат дополняется слева знаком. Некоторые примеры:

44::bit(10)                    0000101100
44::bit(3)                     100
cast(-44 as bit(12))           111111010100
'1110'::bit(4)::integer        14

Обратите внимание, что приведение к типу «bit» без длины означает приведение к bit(1) и выдаст только один младший значащий бит целого.