XOR: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показано 37 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''XOR''' (исключающее | '''XOR''' (исключающее или, читается «ксор») — стандартное слово [[Каллисто]]. 32-битное поразрядное сложение по модулю два. | ||
XOR ( | XOR ( n1 n2 −− i ) 32−битное сложение по модулю два (исключающее или). | ||
i := n1 ⊕ n2 | |||
[[Файл:CallistoXorIdotRegQEmitHex.png|thumb|right|264px|Пример работы слова XOR]] | |||
Выполняет 32-битное логическое исключающее «или» для целых чисел n1 и n2, результат в [[Дополнительный код|дополнительном коде]] i заносится в [[Стек данных|стек]]. | |||
Другими словами, каждый из 32 битов числа n1 сравнивается с соответствующим битом числа n2 и, если один из них (но не оба) равен единице, в соответствующий бит числа i заносится единица. В противном случае, когда оба рассматриваемых бита совпадают, соответствующий бит результата i будет равен нулю. | |||
== | == Ввод слова XOR == | ||
В [[ | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите три белые клавиши [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша ×|{{Серая клавиша|×}}]] | ||
== XOR в стандарте ANS Forth == | == XOR в стандарте ANS Forth == | ||
Строка 18: | Строка 15: | ||
x3 поразрядное исключающее-или x1 и x2. | x3 поразрядное исключающее-или x1 и x2. | ||
== XOR в предыдущем стандарте Forth-83 (англ.) == | == История == | ||
В отечественных калькуляторах команда XOR претерпела большие изменения. В советских ПМК команда К⨁ осуществляла побитовое сложение по модулю два во всех тетрадах [[Мантисса|мантиссы]] в [[Двоично-десятичный формат|формате bcd]], кроме старшей. В [[МК-152|«Электронике МК-152»]] команда получила более практичное назначение и новое имя и имя [[K XOR]], сохранив свой код операции. Команда [[K XOR]] стала работать с 8-битными двоичными числами. Именно на её основе удалось реализовать стандартное слово XOR для работы с 32-битными целыми. | |||
=== XOR в предыдущем стандарте Forth-83 (англ.) === | |||
XOR 16b1 16b2 -- 16b3 79 "x-or" | XOR 16b1 16b2 -- 16b3 79 "x-or" | ||
16b3 is the bit-by-bit exclusive-or of 16b1 with 16b2. | 16b3 is the bit-by-bit exclusive-or of 16b1 with 16b2. | ||
== XOR в стандарте Forth-79 (англ.) == | === XOR в стандарте Forth-79 (англ.) === | ||
XOR n1 n2 -- n3 174 "x-or" | XOR n1 n2 -- n3 174 "x-or" | ||
Leave the bitwise exclusive-or of two numbers. | Leave the bitwise exclusive-or of two numbers. | ||
== XOR в fig-FORTH Release 1 glossary, май 1979 (англ.) == | === XOR в fig-FORTH Release 1 glossary, май 1979 (англ.) === | ||
XOR nl n2 --- xor L1 | XOR nl n2 --- xor L1 | ||
Leave the bitwise logical exclusive or of two values. | Leave the bitwise logical exclusive or of two values. | ||
== Реализация == | |||
В [[Каллисто]] для записи 32-битных целых чисел в [[Стек данных|десятичном стеке]] используется [[дополнительный код]] (''англ.'' two's complement). На входе слово XOR принимает как 32-битные целые в [[Дополнительный код|дополнительном коде]], так и беззнаковые целые. Результат i всегда представлен в [[Дополнительный код|дополнительном коде]] и отрицателен, если старший бит в нём установлен. | |||
XOR даёт правильный результат побитового исключающего «или» над числами любой разрядности, меньшей 32, включая 24-, 16- и 8-битные числа. Если оба аргумента разрядности меньше, чем 32, представлены в [[Дополнительный код|дополнительном коде]], результат i также выдаётся в [[Дополнительный код|дополнительном коде]]. Если оба аргумента представлены в беззнаковом виде, результат также будет в беззнаковом виде — положительным числом или нулём. | |||
Последовательности слов {{Текст на индикаторе|65535, XOR}} и {{Текст на индикаторе|255 XOR}} позволяют сделать поразрядное логическое отрицание (NOT) 16-битного и 8-битного числа, находящегося на вершине [[Стек данных|стека]]. | |||
Также слово XOR можно использовать для логической операции исключающего "или" над флагами, если значение «истина» представляется числом -1. Все стандартные слова [[Каллисто]], возвращающие логическое значение (например, команды сравнения), используют это значение для возвращаемого флага «истина». | |||
В [[Каллисто|Каллисто 1.0]] слово XOR реализовано с использованием команды ЭКВМ [[K XOR]]: | |||
<pre> | |||
1481 ; Приводит 32−битное число в беззнаковый вид. | |||
1482 Norm32: FX<0 N32A | |||
1483 65536 FX^2 + ; FX^2 vs ENT ∗ | |||
1484 N32A: RTN | |||
… | |||
1506 ; Преобразование 32−битного беззнакового в 32−битное знаковое. | |||
1507 Sign32: | |||
1508 32768 ENT 65536 ∗ ; 2 147 483 648 | |||
1509 − FX<0 S32Fix | |||
1510 FANS + RTN ; Восстановить исходное число | |||
1511 S32Fix: FANS − RTN ; Преобразовать | |||
1512 | |||
1513 ;#XOR | |||
1514 ; XOR ( n1 n2 −− i ) 32−битное сложение по модулю два (исключающее или). i := n1 ⊕ n2 | |||
1515 LSXOR: .DB 3 | |||
1516 .TEXT "XOR" ; ( a b −− a XOR b ) | |||
1517 .DW LSOR | |||
1518 SXOR: .DW JSXOR ; 32−битное побитовое логическое исключающее ИЛИ (XOR). | |||
1519 JSXOR: RM3 MB 1 M1 + MA M3 | |||
1520 CX M8 4 M0 | |||
1521 KRMB PGSB Norm32 MB | |||
1522 KRMA PGSB Norm32 MA | |||
1523 GOTO SXORIN | |||
1524 SXORL: M8 RM1 RME ∗ M1 | |||
1525 RMA | |||
1526 SXORIN: ENT RME / FANS <−> KINT MA ∗ − | |||
1527 RMB ENT RME / FANS <−> KINT MB ∗ − | |||
1528 KXOR RM1 ∗ RM8 + | |||
1529 FL0 SXORL | |||
1530 PGSB Sign32 | |||
1531 PKM03 KGOTO9 | |||
</pre> | |||
Реализация из SP-Forth 4.20: | |||
<pre> | |||
CODE XOR ( x1 x2 -- x3 ) \ 94 | |||
\ x3 - побитовое "исключающее ИЛИ" x1 и x2. | |||
XOR EAX, [EBP] | |||
LEA EBP, 4 [EBP] | |||
RET | |||
END-CODE | |||
</pre> | |||
=== Советская реализация === | |||
Слово XOR в ФОРТ-ЕС было [[примитив]]ом. Вот его определение: | |||
<PRE> | |||
XOR W1,W2->W3 ПОРАЗРЯДНОЕ "ИСКЛЮЧАЮЩЕЕ ИЛИ" 13 | |||
Экран номер 13 | |||
( 31.03.86 AND OR XOR NOT 0= 0< ) | |||
CODE XOR ( W1,M2->W3) | |||
14 LHRW12 BAL, RW1 RW2 XR, POPPUT1 B, END-CODE | |||
</PRE> | |||
В FORTH ИТЭФ слово XOR также было [[примитив]]ом, вот его определение: | |||
<PRE> | |||
HEAD 203Q,'AN',304Q,$AND ; AND | |||
POP AX | |||
POP CX | |||
AND AX, CX | |||
ENDA: PUSH AX | |||
NEXT | |||
... | |||
HEAD 203Q,'XO',322Q,$XOR ; XOR | |||
POP AX | |||
POP CX | |||
XOR AX, CX | |||
JMP ENDA | |||
</PRE> | |||
== Ссылки == | == Ссылки == | ||
* См. слова [[AND]] [[OR]] [[ | * {{Исходник|XOR|XOR}} | ||
* См. слова [[AND]], [[OR]] и [[NOT]] | |||
* [http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E_2 Сложение по модулю 2], [https://ru.wikipedia.org/wiki/%D0%9B%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0_%D0%B2%D1%8B%D1%81%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9 Логика высказываний] и [https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8 Битовые операции] в Википедии | * [http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E_2 Сложение по модулю 2], [https://ru.wikipedia.org/wiki/%D0%9B%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0_%D0%B2%D1%8B%D1%81%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9 Логика высказываний] и [https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8 Битовые операции] в Википедии | ||
* [http://www.catb.org/~esr/jargon/html/X/xor.html XOR на The Jargon File] ''(англ.)'' | * [http://www.catb.org/~esr/jargon/html/X/xor.html XOR на The Jargon File] ''(англ.)'' | ||
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2490 | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.2490 XOR (x-or)] в стандарте ANS Forth ''(англ.)'' | ||
* [http:// | * Слово [http://forth-standard.org/standard/core/XOR XOR (x-or)] в черновике Forth 200x ''(англ.)'' | ||
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\04.%20KOMPJUTER%20%22PRINIMAET%20RESENIA%22 КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ"] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | |||
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\07.TISLO%20TIPOW%20TISEL ЧИСЛО ТИПОВ ЧИСЕЛ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | |||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | |||
[[Категория:Логические операции Каллисто]] | [[Категория:Логические операции Каллисто]] | ||
[[Категория: | [[Категория:Усовершенствованные слова]] | ||
[[Категория:Стандартные слова]] | |||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 16:55, 10 ноября 2017
XOR (исключающее или, читается «ксор») — стандартное слово Каллисто. 32-битное поразрядное сложение по модулю два.
XOR ( n1 n2 −− i ) 32−битное сложение по модулю два (исключающее или). i := n1 ⊕ n2
Выполняет 32-битное логическое исключающее «или» для целых чисел n1 и n2, результат в дополнительном коде i заносится в стек.
Другими словами, каждый из 32 битов числа n1 сравнивается с соответствующим битом числа n2 и, если один из них (но не оба) равен единице, в соответствующий бит числа i заносится единица. В противном случае, когда оба рассматриваемых бита совпадают, соответствующий бит результата i будет равен нулю.
Ввод слова XOR[править]
В режиме ЛАТ последовательно нажмите три белые клавиши 0 5 ×
XOR в стандарте ANS Forth[править]
6.1.2490 XOR "x-or" CORE ( x1 x2 -- x3 ) x3 поразрядное исключающее-или x1 и x2.
История[править]
В отечественных калькуляторах команда XOR претерпела большие изменения. В советских ПМК команда К⨁ осуществляла побитовое сложение по модулю два во всех тетрадах мантиссы в формате bcd, кроме старшей. В «Электронике МК-152» команда получила более практичное назначение и новое имя и имя K XOR, сохранив свой код операции. Команда K XOR стала работать с 8-битными двоичными числами. Именно на её основе удалось реализовать стандартное слово XOR для работы с 32-битными целыми.
XOR в предыдущем стандарте Forth-83 (англ.)[править]
XOR 16b1 16b2 -- 16b3 79 "x-or" 16b3 is the bit-by-bit exclusive-or of 16b1 with 16b2.
XOR в стандарте Forth-79 (англ.)[править]
XOR n1 n2 -- n3 174 "x-or" Leave the bitwise exclusive-or of two numbers.
XOR в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
XOR nl n2 --- xor L1 Leave the bitwise logical exclusive or of two values.
Реализация[править]
В Каллисто для записи 32-битных целых чисел в десятичном стеке используется дополнительный код (англ. two's complement). На входе слово XOR принимает как 32-битные целые в дополнительном коде, так и беззнаковые целые. Результат i всегда представлен в дополнительном коде и отрицателен, если старший бит в нём установлен.
XOR даёт правильный результат побитового исключающего «или» над числами любой разрядности, меньшей 32, включая 24-, 16- и 8-битные числа. Если оба аргумента разрядности меньше, чем 32, представлены в дополнительном коде, результат i также выдаётся в дополнительном коде. Если оба аргумента представлены в беззнаковом виде, результат также будет в беззнаковом виде — положительным числом или нулём.
Последовательности слов 65535, XOR и 255 XOR позволяют сделать поразрядное логическое отрицание (NOT) 16-битного и 8-битного числа, находящегося на вершине стека.
Также слово XOR можно использовать для логической операции исключающего "или" над флагами, если значение «истина» представляется числом -1. Все стандартные слова Каллисто, возвращающие логическое значение (например, команды сравнения), используют это значение для возвращаемого флага «истина».
В Каллисто 1.0 слово XOR реализовано с использованием команды ЭКВМ K XOR:
1481 ; Приводит 32−битное число в беззнаковый вид. 1482 Norm32: FX<0 N32A 1483 65536 FX^2 + ; FX^2 vs ENT ∗ 1484 N32A: RTN … 1506 ; Преобразование 32−битного беззнакового в 32−битное знаковое. 1507 Sign32: 1508 32768 ENT 65536 ∗ ; 2 147 483 648 1509 − FX<0 S32Fix 1510 FANS + RTN ; Восстановить исходное число 1511 S32Fix: FANS − RTN ; Преобразовать 1512 1513 ;#XOR 1514 ; XOR ( n1 n2 −− i ) 32−битное сложение по модулю два (исключающее или). i := n1 ⊕ n2 1515 LSXOR: .DB 3 1516 .TEXT "XOR" ; ( a b −− a XOR b ) 1517 .DW LSOR 1518 SXOR: .DW JSXOR ; 32−битное побитовое логическое исключающее ИЛИ (XOR). 1519 JSXOR: RM3 MB 1 M1 + MA M3 1520 CX M8 4 M0 1521 KRMB PGSB Norm32 MB 1522 KRMA PGSB Norm32 MA 1523 GOTO SXORIN 1524 SXORL: M8 RM1 RME ∗ M1 1525 RMA 1526 SXORIN: ENT RME / FANS <−> KINT MA ∗ − 1527 RMB ENT RME / FANS <−> KINT MB ∗ − 1528 KXOR RM1 ∗ RM8 + 1529 FL0 SXORL 1530 PGSB Sign32 1531 PKM03 KGOTO9
Реализация из SP-Forth 4.20:
CODE XOR ( x1 x2 -- x3 ) \ 94 \ x3 - побитовое "исключающее ИЛИ" x1 и x2. XOR EAX, [EBP] LEA EBP, 4 [EBP] RET END-CODE
Советская реализация[править]
Слово XOR в ФОРТ-ЕС было примитивом. Вот его определение:
XOR W1,W2->W3 ПОРАЗРЯДНОЕ "ИСКЛЮЧАЮЩЕЕ ИЛИ" 13 Экран номер 13 ( 31.03.86 AND OR XOR NOT 0= 0< ) CODE XOR ( W1,M2->W3) 14 LHRW12 BAL, RW1 RW2 XR, POPPUT1 B, END-CODE
В FORTH ИТЭФ слово XOR также было примитивом, вот его определение:
HEAD 203Q,'AN',304Q,$AND ; AND POP AX POP CX AND AX, CX ENDA: PUSH AX NEXT ... HEAD 203Q,'XO',322Q,$XOR ; XOR POP AX POP CX XOR AX, CX JMP ENDA
Ссылки[править]
- Исходный текст слова XOR в Каллисто Классик 1.0
- См. слова AND, OR и NOT
- Сложение по модулю 2, Логика высказываний и Битовые операции в Википедии
- XOR на The Jargon File (англ.)
- Слово XOR (x-or) в стандарте ANS Forth (англ.)
- Слово XOR (x-or) в черновике Forth 200x (англ.)
- КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ" в книге Л.Броуди «Начальный курс программирования на языке Форт»
- ЧИСЛО ТИПОВ ЧИСЕЛ в книге Л.Броуди «Начальный курс программирования на языке Форт»
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |