Сложение по модулю 2
Сложе́ние по модулю 2 («сумма по модулю 2», «не равно», исключа́ющее «ИЛИ» (ИЛИ с исключением из правила четвёртой комбинации "1,1"), XOR,) — логическая операция (функция), по своему применению максимально приближённая к грамматической конструкции «либо … либо …» или «если операнды не равны, то истинно (1)».
Сложение по модулю 2 может быть: бинарной операцией (функцией), то есть иметь два операнда (аргумента), тринарной (триарной) операцией (функцией), то есть иметь три операнда (аргумента) или n-арной операцией (функцией), т.е. иметь n операндов (аргументов).
Запись может быть префиксной ("польская запись") - знак операции ставится перед операндами, инфиксной - знак операции ставится между операндами и постфиксной - знак операции ставится после операндов. При числе операндов более 2-х префиксная и постфиксная записи экономичнее инфиксной записи. Чаще всего встречаются следующие варианты записи:
<math>\oplus_2(a,b), ~a</math> ^ <math>~b, ~a \oplus b, a \oplus_2 b, a +_2 b, </math> a ≠ b, <math>a\ne b, (a,b)\oplus_2, a ~XOR~ b</math>.
Булева алгебра
В булевой алгебре сложение по модулю 2 — это функция двух, трёх и более переменных (они же — операнды операции, они же - аргументы функции). Переменные могут принимать значения из множества <math>~\{0, 1\}</math>. Результат также принадлежит множеству <math>~\{0, 1\}</math>. Вычисление результата производится по простому правилу, либо по таблице истинности. Вместо значений <math>~0, 1</math> может использоваться любая другая пара подходящих символов, например <math>~false, true</math> или <math>~F, T</math> или «ложь», «истина».
Таблицы истинности:
для бинарного сложения по модулю 2
Правило (только для бинарного сложения по модулю 2): результат равен <math>~0</math>, если оба операнда равны; во всех остальных случаях результат равен <math>~1</math>.
<math>~a</math> | <math>~b</math> | <math>~a \oplus b</math> |
<math>~0</math> | <math>~0</math> | <math>~0</math> |
<math>~0</math> | <math>~1</math> | <math>~1</math> |
<math>~1</math> | <math>~0</math> | <math>~1</math> |
<math>~1</math> | <math>~1</math> | <math>~0</math> |
для тернарного сложения по модулю 2
X | Y | Z | ⊕(X,Y,Z) | |
---|---|---|---|---|
0 | 0 | 0 | 0 | |
1 | 0 | 0 | 1 | |
0 | 1 | 0 | 1 | |
1 | 1 | 0 | 0 | |
0 | 0 | 1 | 1 | |
1 | 0 | 1 | 0 | |
0 | 1 | 1 | 0 | |
1 | 1 | 1 | 1 |
Программирование
В языках C/C++ (а также Java, C#, Ruby, PHP, JavaScript и т. д.) эта операция обозначается символом «^», в языках Паскаль, Delphi, Ada - зарезервированным словом XOR, в языке ассемблера - одноимённой логической командой. Сложение по модулю 2 выполняется для всех битов левого и правого операнда попарно. Например,
если | |
a = | <math>~01100101_2</math> |
b = | <math>~00101001_2</math> |
то | |
a ^ b = | <math>~01001100_2</math> |
Выполнение операции XOR для значений логического типа (true, false) производится в разных языках программирования по-разному. Например в Delphi используется встроенный оператор XOR (пример: condition1 xor condition2). В языке C, начиная со стандарта C99, оператор «^» над операндами логического типа возвращает результат применения операции XOR. В С++ оператор «^» для логического типа bool возвращает результат согласно описанным правилам, для остальных же типов производится его побитовое применение. Перегрузка для стандартных типов невозможна, но операцию XOR над ними можно реализовать, исходя из принципа "исключающего ИЛИ". Выглядит это так:
(condition1 || condition2) && (!condition1 || !condition2)
(при этом нет разницы, применяются ли побитовые операторы & и |, или же логические && и ||)
Связь с естественным языком
В естественном языке операция "сложение по модулю 2" эквивалентна двум выражениям:
1. "результат истинен (равен 1), если A не равно B (A≠B)";
2. "если A не равно B (A≠B), то истина (1)".
Часто указывают на сходство между сложением по модулю 2 и конструкцией «либо … либо …» в естественном языке. Составное утверждение «либо A, либо B» считается истинным, когда истинно либо A, либо B, но не оба сразу; в противном случае составное утверждение ложно. Это в точности соответствует определению операции в булевой алгебре, если «истину» обозначать как <math>1</math>, а «ложь» как <math>0</math>.
Эту операцию нередко сравнивают с дизъюнкцией потому, что они очень похожи по свойствам, и обе имеют сходство с союзом «или» в повседневной речи. Сравните правила для этих операций:
- <math>A \lor B</math> истинно, если истинно <math>~A</math> или <math>~B</math>, или оба сразу.
- <math>A \oplus B</math> истинно, если истинно <math>~A</math> или <math>~B</math>, но не оба сразу.
Операция <math>\oplus</math> исключает последний вариант («оба сразу») и по этой причине называется исключающим «ИЛИ». Операция <math>\lor</math> включает последний вариант («оба сразу») и по этой причине иногда называется включающим «ИЛИ». Неоднозначность естественного языка заключается в том, что союз «или» может применяться в обоих случаях.
См. также
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....