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