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 ;

Ссылки


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.