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

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

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

Оператор

Описание

Пример(ы)

bit || bitbit

Конкатенация

B'10001' || B'011'10001011

bit & bitbit

Битовое И (операнды должны быть одинаковой длины)

B'10001' & B'01101'00001

bit | bitbit

Битовое ИЛИ (операнды должны быть одинаковой длины)

B'10001' | B'01101'11101

bit # bitbit

Битовое исключающее ИЛИ (операнды должны быть одинаковой длины)

B'10001' # B'01101'11100

~ bitbit

Битовое НЕ

~ B'10001'01110

bit << integerbit

Битовый сдвиг влево (с сохранением длины строки)

B'10001' << 301000

bit >> integerbit

Битовый сдвиг вправо (с сохранением длины строки)

B'10001' >> 200100


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

Таблица 9.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 ( bits bit PLACING newsubstring bit FROM start integer [FOR count integer] ) → bit

Заменяет подстроку в bits, начиная с бита с номером start, длиной count бит, на подстроку newsubstring. В отсутствие параметра count количество заменяемых бит определяется длиной newsubstring.

overlay(B'01010101010101010' placing B'11111' from 2 for 3)0111110101010101010

position ( substring bit IN bits bit ) → integer

Возвращает начальную позицию первого вхождения substring в bits либо 0, если такого вхождения нет.

position(B'010' in B'000001101011')8

substring ( bits bit [FROM start integer] [FOR count integer] ) → bit

Извлекает из bits подстроку, начиная с позиции start (если она указана), длиной до count бит (если она указана). Параметры start и count могут опускаться, но не оба сразу.

substring(B'110010111111' from 3 for 2)00

get_bit ( bits bit, n integer ) → integer

Извлекает из битовой строки бит с номером n; первый (самый левый) бит имеет номер 0.

get_bit(B'101010101010101010', 6)1

set_bit ( bits bit, n integer, newvalue integer ) → bit

Устанавливает для бита с номером n в битовой строке значение newvalue; первый (самый левый) бит имеет номер 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) и в результате будет получен только один самый младший бит числа.