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

В этом разделе описываются функции и операторы для проверки и обработки битовых строк, то есть значений типов 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) и выдаст только один младший значащий бит целого.