« Назад
Битовые функции оперируют параметрами типа Numeric или Varbinary, или Blob. Если параметр типа Numeric не является целым, то он преобразовывается в целую величину.
В двоичном (битовом) представлении целое число состоит из нулей и единиц, например на 4-х битах число 3 – это 0011, число 6 – это 0110.
Биты нумеруются справа налево. Наименьший бит имеет номер 0.
При выполнении битовой операции op, где op – это AND, OR или XOR, над операндами nExpr1 и nExpr2 эта операция выполняется побитно. Результаты операций для двух битов описаны в табл. 3.17.
Таблица 3.17
Результаты битовых операций
Бит операнда nExpr1
|
Бит операнда nExpr2
|
Результат операции
|
AND
|
OR
|
XOR
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
0
|
1
|
0
|
0
|
1
|
1
|
В случае параметра типа Varbinary или Blob каждый байт представляется двумя литералами, нумерация байт выполняется слева направо, но внутри каждого байта биты нумеруются справа налево.
Битовые функции, приведенные в табл. 3.18, имеют 2 варианта синтаксиса: с числовыми и двоичными выражениями.
Таблица 3.18
Битовые функции
Функция
|
Описание / примеры
|
BITAND(nExpression1, nExpression2, … nExpression26)
|
Возвращает результат побитового И двух или более выражений типа Numeric
x = 3 && 0011 y = 6 && 0110 ? Bitand( x, y) && Напечатает: 2 (0010)
|
BITAND(BinaryExpression1, BinaryExpression2, ..., BinaryExpression26)
|
То же для выражений типа Varbinary или Blob. Если выражения имеют разную длину, то более длины выражений выравниваются за счет добавления в конец более короткого выражения литералов 0h00
|
BITCLEAR(nExpression1, nExpression2)
|
Очищает бит в позиции nExpression2 целого числа nExpression1. Диапазон изменения параметра nExpression2 от 0 до 31
x = 7 && 0111 y = 2 && Позиция очищаемого бита ? Bitclear( x, y) && Напечатает: 3 (0011)
|
BITCLEAR(BinaryExpression, [, nStartBit [, nBitCount]])
|
То же для выражения BinaryExpression типа Varbinary или Blob. Параметр nStartBit задает начальный бит для выполнения операции; параметр nBitCount – число бит, участвующих в операции. Если параметры nStartBit и nBitCount опущены, то операция выполняется для всех биты. Если задан только параметр nStartBit, то операция выполняется только для бита с номером nStartBit
? Bitclear(0h616263, 0, 8) && Напечатает: 0h006263
|
BITLSHIFT(nExpression1, nExpression2)
|
Возвращает результат левого сдвига битов целого числа nExpression1 на число позиций, заданных nExpression2
x = 5 && 0101 y = 1 && Сдвиг на 1 позицию влево ? Bitlshift( x, y) && Напечатает: 10 (1010)
|
BITNOT(nExpression)
|
Возвращает битовое НЕ целочисленного параметра. Для результата справедливо равенство BITNOT(x) + x = –1
x = 5 && 0101 ? Bitnot(x) && Напечатает: –6
|
BITNOT(BinaryExpression [, nStartBit [, nBitCount]])
|
То же для выражения типа Varbinary или Blob. Смысл параметров nStartBit и nBitCount см. в описании функции BITCLEAR( )
|
BITOR(nExpression1, nExpression2, … nExpression26)
|
Возвращает результат побитового ИЛИ двух или более целочисленных выражений
x = 3 && 0011 y = 6 && 0110 ? Bitor( x, y) && Напечатает: 7 (0111)
|
BITOR(BinaryExpression1, BinaryExpression2, ..., BinaryExpression26)
|
То же для параметров типа Varbinary или Blob
|
BITRSHIFT(nExpression1, nExpression2)
|
Возвращает результат правого сдвига битов целого числа nExpression1 на число позиций, заданных nExpression2
x = 5 && 0101 y = 1 && Сдвиг на 1 позицию вправо ? Bitrshift( x, y) && Напечатает: 2 (0010)
|
BITSET(nExpression1, nExpression2)
|
Устанавливает 1 в бит в позиции nExpression2 целого числа nExpression1. Диапазон изменения параметра nExpression2 от 0 до 31
x = 7 && 0111 y = 3 && Позиция устанавливаемого бита ? Bitset( x, y) && Напечатает: 15 (1111)
|
BITSET(BinaryExpression [, nStartBit [, nBitCount]])
|
То же для выражения типа Varbinary или Blob. Смысл параметров nStartBit и nBitCount см. в описании функции BITCLEAR( )
|
BITTEST(nExpression1, nBitNumber)
|
Возвращает .T., если бит в позиции nBitNumber целого числа nExpression1 содержит 1. В противном случае возвращает .F. Диапазон изменения параметра nExpression2 от 0 до 31. В примере функция IsEven( ) проверяет 0-й бит параметра nVal и в зависимости от его значения определяет, четно ли число или нет
? IsEven(2) && Напечатает: .T. ? IsEven(3) && Напечатает: .F. function IsEven(nVal) return not Bittest(nVal, 0) endFunc
|
BITTEST(BinaryExpression, nBitNumber)
|
То же для выражения типа Varbinary или Blob. В примере выводится двоичное представление латинского символа "a"
bVal = Cast('abc' as Q(3)) for ind = 7 to 0 step –1 ?? Iif(Bittest(bVal, ind), 1, 0) next
Результат: 01100001
|
BITXOR(nExpression1, nExpression2, … nExpression26)
|
Возвращает результат побитового исключающего ИЛИ двух или более целочисленных числовых выражений
x = 3 && 0011 y = 6 && 0110 ? Bitxor( x, y) && Напечатает: 5 (0101)
|
BITXOR(BinaryExpression1, BinaryExpression2, ..., BinaryExpression26)
|
То же для параметров типа Varbinary или Blob. Длина параметров выравнивается (см. описание функции BITAND( ))
|
|