Распечатать страницу

Битовые функции в Visual FoxPro

« Назад

Битовые функции оперируют параметрами типа 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( ))