9.6. Функции и операторы для работы с битовыми строками #
В этом разделе описываются функции и операторы, предназначенные для работы с битовыми строками, то есть с данными типов bit
и bit varying
. (Хотя в этих таблицах упоминается только тип bit
, с ним полностью взаимозаменяем тип bit varying
.) Для битовых строк поддерживаются обычные операторы сравнения, показанные в Таблице 9.1, а также операторы, приведённые в Таблице 9.14.
Таблица 9.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
|
Некоторые функции, работающие с двоичными строками, также работают и с битовыми строками, как показано в Таблице 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)
и в результате будет получен только один самый младший бит числа.