Начальный курс программирования на языке Форт

         

Часть 2 ДЛЯ ВСЕХ ДВОИЧНАЯ ЛОГИКА


Слова AND и OR (введенные в гл. 4) используют «двоичную логику», т. е. каждый бит проверяется независимо, и перенос единицы в старший разряд не производится. Выполним, например, операцию AND над следующими двумя двоичными числами: 0000000011111111 0110010110100010 AND ---------------- 0000000010100010

Для того чтобы результирующий бит был равен единице, соответствующие биты-аргументы должны быть оба равными единице. Заметьте, что в этом примере первый аргумент содержит все нули в старшем байте и все единицы в младшем. Действие второго операнда здесь заключается в том, что младшие восемь битов сохраняются неизменными, а старшие восемь битов сбрасываются в нуль. Первый операнд служит «маской» для маскирования старшего байта второго операнда.

Слово OR также применяет двоичную логику. В примере1000100100001001 0000001111001000 OR ---------------- 1000101111001001

единицу получается в тех битах, где хотя бы один операнд был равен единице. И снова каждый столбец проверяется независимо, без переноса единицы в старший разряд. При умелом использовании масок в одном 16-разрядном значении можно хранить 16 отдельных флагов. Так, мы можем узнать, чему равен соответствующий (скажем, пятый) бит: 1011101010011100 нулю или единице, путем маскирования остальных флагов: 1011101010011100

0000000000010000 AND ---------------- 0000000000010000

Так как значение нашего бита равно единице, результат будет истинным. Если бы значение бита составляло нуль, то результат

оказался бы ложным. Мы можем сбросить определенный флаг в нуль, не трогая остальные, следующим приемом: 1011101010011100 1111111111101111 AND

---------------- 1011101010001100 ^

Мы работали с маской, во всех битах которой, за исключением сбрасываемого в нуль, содержатся единицы. Можно установить тот же самый флаг, т. е. сделать его единицей, таким образом: 1011101010001100

0000000000010000 OR ---------------- 1011101010011100 ^

Ниже приводятся несколько приемов использования операции AND.


Вы могли заметить, что значение строчной буквы в коде ASCII отличается от значения прописной в точности на 32 (в десятичной системе счисления). Мы можем создать определение, которое осуществляло бы перевод строчного символа в прописной:: ПРОПИСНОЙ ( строчный-символ -- прописной-символ ) 32 - ;



Итак, 97 EMIT a ok

97 ПРОПИСНОЙ EMIT A ok

К сожалению, данный вариант слова ПРОПИСНОЙ не будет действовать в том случае, если переводимый символ уже является прописным, поскольку весь процесс перевода сводится к простому вычитанию.

Но код ASCII разработан очень мудро. Число 32 выбрано не случайно, а с учетом его представления в двоичной системе счисления. Посмотрите, как выглядят представления прописной и строчной букв А: A 1000001 a 1100001

Они отличаются только одним битом, который и представляет число 32. Если мы сбросим этот бит в 0, то независимо от того, была ли буква прописной или строчной, она станет прописной: : ПРОПИСНОЙ ( строчный-символ -- прописной-символ ) 95 AND ;

Число 95 является десятичным эквивалентом двоичного числа 1011111

и совпадает с маской для двоичного представления числа 32. Следовательно, 97 ПРОПИСНОЙ EMIT A ok

65 ПРОПИСНОЙ EMIT A ok

(Однако поведение рассматриваемого варианта слова ПРОПИСНОЙ оказывается несколько странным по отношению к небуквенным символам. Попытайтесь, к примеру, перевести цифры.)

Слово XOR также предназначено для работы с битами. Как отмечалось в гл. 4, при выполнении этой операции истина получается только тогда, когда один из аргументов (но не оба сразу) истинен. Сравним результат выполнения операций XOR и OR:1000100100001001 1000100100001001

0000001111001000 OR 0000001111001000 XOR ---------------- ---------------- 1000101111001001 1000101011000001

Если вы применяете операцию XOR с аргументом, все биты которого равны единице, то тем самым инвертируете биты второго аргумента. 1111111111111111 1000100100001001 XOR ---------------- 0111011011110110

Таким образом, выражение -1 XOR

является двоичной маской или шаблоном инвертирования. (Существует математический термин дополнение числа до единицы.)

Стандарт-83 и операция NOT Стандарт 83 изменил первоначальный смысл операции NOT В системах, разработанных до принятия этого Стандарта, слово NOT заменяло значение логического аргумента оператора IF противоположным, т е не нуль (истина) становился нулем (ложью) Оно было синонимом слова О.= , созданным для улучшения читабельности программы. В Стандарте-83 слово NOT эквивалентно выражению "-1 XOR" и не сработает в том случае, если значение исходного флага «истина» не представлено как -1. 

Обязательно убедитесь в том, что инвертируемое значение является логическим, а не арифметическим. Выражение "0= NOT" вырабатывает из ненулевого значения правильное логическое значение «истина».


Содержание раздела