NOT
NOT (инверсия, читается «нот») — усовершенствованное слово Каллисто. 32-битное поразрядное логическое отрицание.
NOT ( n −− i ) 32−битная логическая инверсия (не). i := ∼n
i — побитовое логическое «не» числа n, то есть каждый из 32 битов целого числа в дополнительном коде i изменён по отношению к соответствующему биту целого числа n.
Эту операцию иногда, не совсем точно, называют обратным кодом или дополнением до единицы (англ. ones' complement).
Ввод слова NOT
В режиме ЛАТ последовательно нажмите клавиши 4 5 2
INVERT в стандарте ANS Forth
6.1.1720 INVERT CORE ( x1 -- x2 ) Инвертирует все биты x1, возвращает его логическую инверсию x2. См.: 6.1.1910 NEGATE, 6.1.0270 0=. A.6.1.1720 INVERT Слово NOT было первоначально предусмотрено в Forth как оператор флага, чтобы делать структуры управления читаемыми. При его назначенном использовании следующие два определения произвели бы идентичный результат: : ONE ( flag -- ) IF ." true" ELSE ." false" THEN ; : TWO ( flag -- ) NOT IF ." false" ELSE ." true" THEN ; Это было обычное использование до Forth-83 Стандарта, который переопределил NOT как в ячейку шириной операцию обратного кода (дополнение до единицы), функционально эквивалентную фразе -1 XOR. В то же самое время, тип данных, управляемый этим словом был изменен от флага до набора битов в ячейку шириной, и стандартное значения для true было изменено с "1" (набор только бита младшего разряда) на "-1" (весь набор битов). Поскольку эти определения TRUE и NOT были несовместимы с их предыдущими определениями, много пользователей Forth продолжают полагаться на старые определения. Следовательно, обе версии находятся в общем использовании. Поэтому использование NOT не может быть стандартизировано в это время. Два традиционных значения NOT - это отрицание смысла флага и выполнение операции обратного кода (дополнение до единицы) - сделаны доступными благодаря 0= и INVERT, соответственно.
История
В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово NOT
В отечественных калькуляторах команда NOT претерпела большие изменения. В 1984 году в «Электронике МК-61» появилась команда К ИНВ, которая осуществляла побитовую инверсию во всех тетрадах мантиссы в формате bcd, кроме старшей. В «Электронике МК-152» команда получила более практичное назначение и новое имя K NOT, сохранив свой код операции. Команда K NOT стала работать с 8-битными двоичными числами. Именно это направление развивает каллистянское слово NOT, предназначенное для обработки 32-битных целых.
В действующем стандарте Форта 1994 года каллистянское слово NOT называется INVERT и оно тоже претерпело ряд приключений. Стандарты Форта признают, что слово NOT двусмысленно — в некоторых реализациях Форта оно синоним 0=
В разных версиях Форта слово NOT получало имена INVERT COM INV COMP COMPLEMENT
Слово NOT под этим названием используется в eForth
NOT в предыдущем стандарте Forth-83 (англ.)
NOT 16b1 -- 16b2 83 16b2 is the one's complement of 16b1.
COM в стандарте Forth-79 (англ.)
COM n1 -- n2 Leave the one's complement of n1.
Реализация
В Каллисто для записи 32-битных целых чисел в десятичном стеке используется дополнительный код (англ. two's complement). Это значит, что операция NOT превращает положительные числа, меньшие 2'147'483'648, в отрицательные. -1 превращается в ноль (и наоборот), остальные отрицательные числа превращаются в положительные.
Хотя NOT можно использовать для логического отрицания результата сравнений (возвращающие «истину» слова Каллисто всегда используют для неё значение -1), в общем случае для похожих целей лучше использовать слово 0=. 0= произведёт правильное логическое отрицание, даже если «истина» закодирована не -1, а любым другим числом, отличным от нуля.
Как и слово /−/, слово NOT реализовано с использованием команды ЭКВМ /−/. В отличии от /−/, слово NOT предназначено для работы исключительно с 32-битными целыми числами в дополнительном коде.
Если вам нужно инвертировать 16-битное целое без знака, используете последовательность NOT 65535, AND или более быструю 65535, XOR .
В Каллисто 1.0 слово NOT является примитивом:
1506 ; Преобразование 32−битного беззнакового в 32−битное знаковое. 1507 Sign32: 1508 32768 ENT 65536 ∗ ; 2 147 483 648 1509 − FX<0 S32Fix 1510 FANS + RTN ; Восстановить исходное число 1511 S32Fix: FANS − RTN ; Преобразовать … 1533 ;#NOT 1534 ; NOT ( n −− i ) 32−битная логическая инверсия (не). i := ∼n 1535 LINVERT: .DB 3 1536 .TEXT "NOT" ; ( n −− NOT n ) 1537 .DW LSXOR 1538 INVERT: .DW JINVERT ; 32−битное побитовое логическое отрицание (НЕ). 1539 JINVERT: PKRM03 KINT PGSB Sign32 1540 1 + +/− PKM03 KGOTO9 ; Отрицание через арифметику.
При необходимости NOT можно определить через /−/ или вычитание:
: NOT ( i -- NOT i ) 1+ /−/ ; : NOT ( i -- NOT i ) -1 ↔ − ;
Реализация в SP-Forth 4.20
CODE INVERT ( x1 -- x2 ) \ 94 \ Инвертировать все биты x1 и получить логическую инверсию x2. NOT EAX RET END-CODE
Советская реализация
У Баранова-Ноздрунова приводится следующее описание слова NOT (стр. 25):
: NOT ( A ---> ^A ) -1 XOR ;
Описание и определение слова NOT в ядре ФОРТ-ЕС:
NOT N1->N2 ПОРАЗРЯДНОЕ ИНВЕРТИРОВАНИЕ 13 Экран номер 13 ( 31.03.86 AND OR XOR NOT 0= 0< ) : NOT ( W1->W2 ) -1 XOR ;
Ссылки
- Исходный текст слова NOT в Каллисто Классик 1.0
- См. слова AND, OR и XOR
- См. также слова /−/ и 0=
- Логическое отрицание, Логика высказываний и Битовые операции в Википедии
- Слово INVERT и комментарий к нему в стандарте ANS Forth (англ.)
- Слово INVERT и комментарий к нему в черновике Forth 200x (англ.)
- КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ" в книге Л.Броуди «Начальный курс программирования на языке Форт»
- ЧИСЛО ТИПОВ ЧИСЕЛ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Decisions, Decisions… в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |