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(bitsbitPLACINGnewsubstringbitFROMstartinteger[FORcountinteger] ) →bit Заменяет подстроку в bits, начиная с бита с номеромstart, длинойcountбит, на подстрокуnewsubstring. В отсутствие параметраcountколичество заменяемых бит определяется длинойnewsubstring. overlay(B'01010101010101010' placing B'11111' from 2 for 3)→0111110101010101010
 | 
|  position(substringbitINbitsbit) →integer Возвращает начальную позицию первого вхождения substringвbitsлибо 0, если такого вхождения нет. position(B'010' in B'000001101011')→8
 | 
|  substring(bitsbit[FROMstartinteger] [FORcountinteger] ) →bit Извлекает из bitsподстроку, начиная с позицииstart(если она указана), длиной доcountбит (если она указана). Параметрыstartиcountмогут опускаться, но не оба сразу. substring(B'110010111111' from 3 for 2)→00
 | 
|  get_bit(bitsbit,ninteger) →integer Извлекает из битовой строки бит с номером n; первый (самый левый) бит имеет номер 0. get_bit(B'101010101010101010', 6)→1
 | 
|  set_bit(bitsbit,ninteger,newvalueinteger) →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) и в результате будет получен только один самый младший бит числа.