Булевские и логические операции
Операция вычисления адреса.
Таблица операций и приоритетов
Выражения.
Выражения и операции
Const
Type
Digits= Set of 0..9;
Letters= Set of 'A'..'Z';
EvenDigits:Digits=[0,2,4,6,8];{множество четных чисел}
Vovels:Letters=['A','E','I','O','U','y']; {множество букв,
используемых для изображения гласных звуков}
Определение терма – такое же, как в стандартном Паскале. Определение фактора дополнительно включает в себя операцию модификатор типа, в остальном, такое же, как в стандартном Паскале.
Операции | Приоритет | Категория |
@ Not + – | Одноместные (знаки) | |
* / Div Mod And Shl Shr | Мультипликативные | |
+ – Or Xor | Аддитивные | |
= <> < > >= <= In | Отношения |
К операциям стандартного Паскаля добавлены следующие операции:
@ – операция вычисления адреса переменной
Shl – операция побитного сдвига влево
Shr – операция побитного сдвига вправо
Xor – исключающее ИЛИ (результат True, если один из операндов имеет значение True, а другой имеет значение False. Если оба операнда имеют одинаковое значение, результат False.
Операции Not, And, Or, Xor в Turbo Pascal могут выполняться не только над данными типа Boolean, но и над данными любого целого типа. Аддитивная операция + определена также для строковых переменных и констант и в этом случае означает операцию конкатенации.
Подробнее об операциях, отсутствующих в стандартном Паскале.
Операция @ записывается перед именем процедур, функций, переменных и типизированных констант. Ее результат – адрес соответствующего объекта, тип – указатель. Значение адреса – 32 бита, из них 16 – адрес начала сегмента и 16 – смещение в сегменте. Применение этой операции к параметру-значению дает адрес этой переменной в стеке при выполнении процедуры или функции. Применение этой операции к параметру-переменной внутри процедуры или функции дает адрес фактического параметра, назначенного при вызове процедуры или функции.
В Turbo Pascal булевскими операциями называют операции над данными типа Boolean и дающие результат типа Boolean. Сюда относятся операции Not, And, Or, Xor.
Логическими операциями называются операции, выполняемые над операндами одного из целочисленных типов (в двухместных операциях оба операнда должны быть одного типа). Их результат – того же типа, что и операнды.
Логические операции выполняются побитно над каждым битом, или каждой парой битов в операндах. К логическим операциям относятся Not, And, Or, Xor, Shl, Shr.
Пример. Пусть объявлены переменные A и B типа Byte, пусть их текущие значения в двоичном виде будут следующие: A = 0001 0011, B = 0010 0010.
Операция | Результат (в двоичном виде) |
Not A | 1110 1100 – инверсия каждого бита |
Shl A | 0010 0110 – сдвиг на 1 бит влево |
A And B | 0000 0010 – единицы только в тех битах, в которых есть единицы одновременно в обоих операндах |
A Or B | 0011 0011 – нули только в тех битах, в которых есть нули одновременно в обоих операндах |
A Xor B | 0010 0001 – единицы только в тех битах, значения которых в обоих операндах разные |
Логические операции можно использовать для широко применяемого приема программирования – наложения двоичных масок. Двоичные маски применяют для проверки состояния определенного бита, для установки части битов в 0 или 1 при сохранении значений остальных битов, для инверсии значений части битов при сохранении значений остальных битов. Потребность в таких операциях часто возникает при программировании взаимодействия с нестандартными устройствами ввода-вывода.
Например, если нужно проверить, установлен ли в единицу шестой бит в переменной B, можно выполнить операцию And с двоичной маской 0010 0000. В шестнадцатеричной записи это будет $20. Далее остается проверить, будет ли результат нулевым. Если нет, значит, этот бит установлен в единицу.
If B And $20 <> 0 then ...;
Если нужно изменить значение первого, второго и четвертого битов переменной A на противоположное, не меняя при этом значения остальных битов, можно выполнить операцию исключающего ИЛИ (Xor) с двоичной маской 0000 1011 (в 16-ричной записи, принятой в Turbo Pascal, это будет $B)
A:= A Xor $B;
Если нужно, чтобы старший, восьмой, бит переменной B был гарантированно установлен в единицу, и при этом не изменилось бы значение остальных битов, можно выполнить операцию Or с маской 1000 0000 (в 16-ричной записи: $80).
Полезно помнить, что операция сдвига влево на один бит эквивалентна умножению целого числа на 2, а операция сдвига вправо на один бит – целочисленному делению (div) на два. При этом операции сдвига выполняются намного быстрее, чем умножение и деление. Правда, при таком способе умножения не обнаруживается переполнение разрядной сетки, поэтому его можно использовать, если заведомо известно, что результат не превысит значение, максимально допустимое для данного типа.