Исключающее «или»: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Обозначения: дополнение, стилевые правки
 
(не показано 117 промежуточных версий 69 участников)
Строка 1: Строка 1:
{{Булева функция
{{Булева функция
|Название = Сложение по модулю 2
| Название = Исключающее «или»
|Другое название = Исключающее ИЛИ
| Другое название = Сложение по модулю 2, XOR
| Диаграмма Венна = Venn0110.svg
|Иллюстрация_ru = Элемент Исключающее ИЛИ (100).png
|Иллюстрация_en =
| Определение =
| Таблица истинности = <math>(0110)</math>
|Подпись =
| Логический вентиль = Элемент Исключающее ИЛИ (100).png
|Размер = 250
| ДНФ = <math>\overline{x} \cdot y + x \cdot \overline{y}</math>
|Определение =
|T0 =Да
| КНФ = <math>( \overline{x} + \overline{y} ) \cdot ( x + y )</math>
| Полином Жегалкина = <math>x \oplus y </math>
|T1 =Нет
|L =Да
| Сохраняет 0 = Да
|S =Нет
| Сохраняет 1 = Нет
|M =Нет
| Монотонна = Нет
| Линейна = Да
|ДНФ =<math>\overline{x} \cdot y + x \cdot \overline{y}</math>
| Самодвойственна = Нет
|КНФ =<math>( \overline{x} + \overline{y} ) \cdot ( x + y )</math>
|Полином Жегалкина =<math>x \oplus y </math>
|Таблица истинности =<math>(0110)</math>
}}
}}
[[Файл:bitwise xor.gif|thumb|График побитового исключающего «или»]]
'''Исключа́ющее «или»''' (''сложе́ние по мо́дулю 2'', ''XOR'', ''строгая дизъюнкция'', ''поразрядное дополнение'', ''инвертирование по маске'', ''жегалкинское сложение'', ''логическое вычитание'', ''логи́ческая неравнозна́чность'') — [[булева функция]], а также [[Логическая операция|логическая]] и [[битовая операция]], в случае двух переменных результат выполнения операции истинен тогда и только тогда, когда один из аргументов истинен, а другой — ложен. Для функции трёх (тернарное сложение по модулю 2) и более переменных — результат выполнения операции будет истинным только тогда, когда количество аргументов, равных 1, составляющих текущий набор, — нечётное. Такая операция естественным образом возникает в [[кольцо вычетов|кольце вычетов по модулю 2]], откуда и происходит название операции.


Сложение по модулю 2 называется «исключающим „или“» и «строгой дизъюнкцией» для отличения от «обычного» (неисключающего) логического «или» — нестрогой [[Дизъюнкция|логической дизъюнкции]]. В [[Теория множеств|теории множеств]] сложению по модулю 2 соответствует операция [[Симметрическая разность|симметрической разности]] двух множеств.
[[Файл:bitwise_xor.gif|thumb|Рис. 1 График побитового исключающего «или»]]
'''Сложе́ние по мо́дулю 2''' ('''логи́ческое сложе́ние''', '''исключа́ющее «ИЛИ»''', '''строгая дизъюнкция''', '''XOR''', '''поразрядное дополнение''', '''побитовый комплемент''', жегалкинское сложение) — [[булева функция]], а также [[Логическая операция|логическая]] и [[битовая операция]]. В случае 2-х переменных результат выполнения операции является истинным тогда и только тогда, когда лишь один из аргументов является истинным. Для функции трёх и более переменных результат выполнения операции будет истинным только тогда, когда количество аргументов равных 1, составляющих текущий набор — нечетное. Такая операция естественным образом возникает в [[кольцо вычетов|кольце вычетов по модулю 2]], откуда и происходит название операции.


[[Отрицание|Инверсией]] исключающего «или» является [[эквиваленция]].
Сложение по модулю 2 следует отличать от простого сложения, которое соответствует обыкновенному неисключающему «или» ([[Дизъюнкция|логической дизъюнкции]]).

В [[Теория множеств|теории множеств]] сложению по модулю 2 соответствует операция [[Симметрическая разность|симметричной разности]] двух множеств.


== Обозначения ==
== Обозначения ==
Запись может быть префиксной («[[польская запись]]») — знак операции ставится перед операндами, [[Инфиксная запись|инфиксной]] — знак операции ставится между операндами и [[Обратная польская запись|постфиксной]] — знак операции ставится после операндов. При числе операндов более двух префиксная и постфиксная записи экономичнее инфиксной записи. Чаще всего встречаются следующие варианты записи:<br><math>\oplus_2(a,b), ~a</math> ^ <math>b, ~a \oplus b, a \oplus_2 b, a +_2 b</math>, a ≠ b, a<>b, a!=b, <math>a\ne b, (a,b)\oplus_2</math>, a XOR b
ПР
Запись может быть префиксной («[[польская запись]]») — знак операции ставится перед операндами, инфиксной — знак операции ста­вит­ся между операндами и постфиксной — знак операции ставится после операндов. При числе операндов более 2-х префиксная и постфиксная записи экономичнее инфиксной записи. Чаще всего встре­ча­ют­ся сле­ду­ю­щие ва­ри­анты за­пи­си:<br /><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 (CIRCLED PLUS) — U+2295 (<span style="font-size: xx-large">{{unicode|&#x2295;}}</span>).
В [[Юникод]]е есть символы для сложения по модулю 2: {{unichar|22BB|XOR}}, {{unichar|2295|CIRCLED PLUS}} и {{unichar|2A27|PLUS SIGN WITH SUBSCRIPT TWO}}, {{unichar|2A52|LOGICAL OR WITH DOT ABOVE}}, а также символ для суммы по модулю 2: {{unichar|2A0A|MODULO TWO SUM}}.


== Свойства ==
== Свойства ==
*

* <math>a \oplus 0 = a</math> ([[Идемпотентность|идемпотентность]])
* <math>a \oplus 1 = \bar a</math> ([[отрицание]])
* <math>a \oplus 1 = \bar a</math> ([[Отрицание|отрицание]])
* <math>a \oplus a = 0</math> ([[XOR-обмен|самообратимость]])
* <math>a \oplus a = 0</math>
* <math>a \oplus b = b \oplus a</math> ([[Коммутативная операция|коммутативность]])
* <math>a \oplus b = b \oplus a</math> ([[Коммутативная операция|коммутативность]])
* <math>( a \oplus b ) \oplus c = a \oplus ( b \oplus c )</math> ([[Ассоциативная операция|асссоциативность]])
* <math>( a \oplus b ) \oplus c = a \oplus ( b \oplus c )</math> ([[Ассоциативная операция|ассоциативность]])
* <math>( a \oplus b ) \oplus b = a</math>
* <math>( a \oplus b ) \oplus b = a</math> ({{iw|реверсивность||en|XNOR gate}})
* <math>\bar a \oplus b = a \oplus \bar b = a \equiv b</math> ([[Сравнение по модулю|сравнения по модулю]])
* <math>\bar a \oplus b = a \oplus \bar b = (a \equiv b)</math> ([[Сравнение по модулю|сравнения по модулю]])
* <math>a \oplus b = c; a \oplus c = b;</math>


== Булева алгебра ==
== Булева алгебра ==
В [[булева алгебра|булевой алгебре]] сложение по модулю 2 — это функция двух, трёх и более переменных (они же — [[операнд]]ы операции, они же — аргументы функции). Переменные могут принимать значения из множества <math>\{0, 1\}</math>. Результат также принадлежит множеству <math>\{0, 1\}</math>. Вычисление результата производится по простому правилу, либо по [[таблица истинности|таблице истинности]]. Вместо значений <math>0, 1</math> может использоваться любая другая пара подходящих символов, например <math>false, true</math> или <math>F, T</math> или «ложь», «истина», но при этом необходимо доопределять старшинство, например, <math>true > false</math>.


Двумерная (двухаргументная, двухкоординатная) диаграмма (двумерный массив) истинности из четырёх ячеек:<br>
В [[булева алгебра|булевой алгебре]] сложение по модулю 2 — это функция двух, трёх и более переменных (они же — [[операнд]]ы операции, они же — аргументы функции). Переменные могут принимать значения из множества <math>~\{0, 1\}</math>. Результат также принадлежит множеству <math>~\{0, 1\}</math>. Вычисление результата производится по простому правилу, либо по [[таблица истинности|таблице истинности]]. Вместо значений <math>~0, 1</math> может использоваться любая другая пара подходящих символов, например <math>~false, true</math> или <math>~F, T</math> или «ложь», «истина», но при этом необходимо доопределять старшинство, например, <math>~true > false</math>.
x⊕y = x XOR y = x<>y = x!=y = x^y
y
1 0
0 1 x
на которой сразу видно, что функция [[Симметричная булева функция|симметрична]] относительно главной диагонали.


Таблицы истинности:
Таблицы истинности:
* для [[Бинарная операция|бинарного]] сложения по модулю 2 (применяется в двоичных [[полусумматор]]ах):
* для [[Бинарная операция|бинарного]] сложения по модулю 2 (применяется в двоичных [[полусумматор]]ах)<ref name="Shilo">Шило В.Л. Популярные цифровые микросхемы: Справочник.— М.: Радио и связь, 1987. — 352 с. — (Массовая радиобиблиотека. Вып. 1111).</ref>{{rp|55–61}}:


{| class="standard"
{| class="wikitable"
|<math>~a</math>
!<math>a</math>
|<math>~b</math>
!<math>b</math>
|align = "center" |<math>~a \oplus b</math>
!<math>a \oplus b</math>
|-
|-
| 0 || 0 || 0
|<math>~0</math>
|<math>~0</math>
|align = "center" |<math>~0</math>
|-
|-
| 0 || 1 || 1
|<math>~0</math>
|<math>~1</math>
|align = "center" |<math>~1</math>
|-
|-
| 1 || 0 || 1
|<math>~1</math>
|<math>~0</math>
|align = "center" |<math>~1</math>
|-
|-
| 1 || 1 || 0
|<math>~1</math>
|<math>~1</math>
|align = "center" |<math>~0</math>
|}
|}

: Правило: результат равен <math>~0</math>, если оба операнда равны; во всех остальных случаях результат равен <math>~1</math>.
Правило: результат равен <math>0</math>, если оба операнда равны; во всех остальных случаях результат равен <math>1</math>.


* для [[Тернарная операция|тернарного]] сложения по модулю 2 (применяется в двоичных полных [[сумматор]]ах):
* для [[Тернарная операция|тернарного]] сложения по модулю 2 (применяется в двоичных полных [[сумматор]]ах):
{| class = "standard"
{| class = "wikitable"
!<math>a</math>||<math>b</math>||<math>c</math>||<math>a \oplus b \oplus c</math>
!X||Y||Z||&oplus;(X,Y,Z)
|-
|-
|0||0||0||align = "center" |0
|0||0||0||align = "center" |0
|-
|-
|1||0||0||align = "center" |1
|0||0||1||align = "center" |1
|-
|-
|0||1||0||align = "center" |1
|0||1||0||align = "center" |1
|-
|-
|1||1||0|| align="center" |0
|0||1||1|| align="center" |0
|-
|-
|0||0||1||align = "center" |1
|1||0||0||align = "center" |1
|-
|-
|1||0||1|| align="center" |0
|1||0||1|| align="center" |0
|-
|-
|0||1||1|| align="center" |0
|1||1||0|| align="center" |0
|-
|-
|1||1||1||align = "center" |1
|1||1||1||align = "center" |1
Строка 93: Строка 88:
|}
|}


Правило: результат равен <math>0</math>, если количество операндов равных <math>1</math> чётное (ноль также является чётным числом), в остальных случаях результат равен <math>1</math>.
== Программирование ==


== Программирование ==
В языках [[Си (язык программирования)|C]]/[[C++]] (а также [[Java]], [[C Sharp|C#]], [[Ruby]], [[PHP]], [[JavaScript]] и т. д.) [[битовая операция]] поразрядного дополнения обозначается символом «<tt>^</tt>», в языках [[Паскаль (язык программирования)|Паскаль]], [[Delphi (язык программирования)|Delphi]], [[Ада (язык программирования)|Ada]], [[Visual_Basic|Visual Basic]] — зарезервированным словом <tt>xor</tt>, в [[Язык ассемблера|языке ассемблера]] — одноимённой логической командой. При этом сложение по модулю 2 выполняется для всех битов левого и правого операнда попарно. Например,
В языках [[Си (язык программирования)|C]]/[[C++]], [[Java]], [[C Sharp|C#]], [[Ruby]], [[PHP]], [[JavaScript]], [[Python]] и т. д. [[битовая операция]] поразрядного дополнения обозначается символом «<tt>^</tt>», в языках [[Паскаль (язык программирования)|Паскаль]], [[Delphi (язык программирования)|Delphi]], [[Ада (язык программирования)|Ada]], [[Turbo Basic]], [[Visual Basic]] — зарезервированным словом <tt>xor</tt>, в [[Язык ассемблера|языке ассемблера]] — одноимённой логической командой. При этом сложение по модулю 2 выполняется для всех битов левого и правого операнда попарно. Например,


: если
: если
Строка 107: Строка 103:
<math>a \hat{\ } b = 01001100_2</math>
<math>a \hat{\ } b = 01001100_2</math>


Выполнение операции ''исключающее «или»'' для значений [[Логический тип|логического типа]] (true, false) производится в разных языках программирования по-разному. Например, в [[Delphi (язык программирования)|Delphi]] используется встроенный оператор XOR (пример: ''условие1'' <tt>xor</tt> ''условие2''). В языке [[Си (язык программирования)|C]], начиная со стандарта [[C99]], оператор «<tt>^</tt>» над операндами логического типа возвращает результат применения логической операции XOR. В [[С++]] оператор «<tt>^</tt>» для логического типа <tt>bool</tt> возвращает результат согласно описанным правилам, для остальных же типов производится его побитовое применение.
Выполнение операции ''исключающее «или»'' для значений [[Логический тип|логического типа]] (true, false) производится в разных языках программирования по-разному. Например, в [[Delphi (язык программирования)|Delphi]] используется встроенный оператор XOR (пример: ''условие1'' <tt>xor</tt> ''условие2''). В языке [[Си (язык программирования)|C]], начиная со стандарта [[C99]], оператор «<tt>^</tt>» над операндами логического типа возвращает результат применения логической операции XOR. В [[C++]] оператор «<tt>^</tt>» для логического типа <tt>bool</tt> возвращает результат согласно описанным правилам, для остальных же типов производится его побитовое применение.

Использование побитового исключающего «или» позволяет [[XOR-обмен|поменять местами значения целых переменных без использования дополнительной памяти]].

== Криптография ==

На основе исключающего «или» работает [[шифр Вернама]], также известный как «одноразовый блокнот», обладающий абсолютной [[Криптографическая стойкость|криптографической стойкостью]]. На практике это означает, что если зашифровать исходное сообщение <math>m</math> при помощи одноразового ключа <math>k</math>, так, чтобы длина сообщения и ключа были равны, то по получившемуся в результате шифрования [[шифротекст]]у <math>c</math> невозможно будет определить значение исходного сообщения без знания ключа.

При этом алгоритм шифрования <math>E</math> представляет собой только одну операцию – исключающее «или»:

<math>E(k,m) = k \oplus m = c</math>

Для дешифровки шифротекста <math>c</math> алгоритмом <math>D</math> исключающее «или» применяют ещё раз:

<math>D(k,c) = k \oplus c = m</math>

Важно понимать, что в случае, если попытаться использовать одинаковые ключи для шифрования более чем одного сообщения на основании исключающего «или», то криптографическая стойкость системы будет нарушена.

Помимо одноразового блокнота, операция исключающего «или» получила распространение во многих криптографических системах и алгоритмах включая [[DES]], [[AES (стандарт шифрования)|AES]] и других.


== Связь с естественным языком ==
== Связь с естественным языком ==
Строка 114: Строка 128:
# «'''если''' A не равно B (A≠B), '''то''' истина (1)».
# «'''если''' A не равно B (A≠B), '''то''' истина (1)».


Часто указывают на сходство между сложением по модулю 2 и конструкцией «либо … либо …» в естественном языке. Составное утверждение «либо A, либо B» считается истинным, когда истинно либо A, либо B, но не оба сразу; в противном случае составное утверждение ложно. Это в точности соответствует определению операции в булевой алгебре, если «истину» обозначать как <math>1</math>, а «ложь» как <math>0</math>.
Часто указывают на сходство между сложением по модулю 2 и конструкцией «либо … либо …» в естественном языке. Составное утверждение «либо A, либо B» считается истинным, когда истинно/ложно либо A, либо B поодиночке, но не оба сразу; в противном случае составное утверждение ложно. Это в точности соответствует определению операции в булевой алгебре, если «истину» обозначать как <math>1</math>, а «ложь» как <math>0</math>.


Эту операцию нередко сравнивают с [[Дизъюнкция|дизъюнкцией]] потому, что они очень похожи по свойствам, и обе имеют сходство с союзом «или» в повседневной речи. Сравните правила для этих операций:
Эту операцию нередко сравнивают с [[Дизъюнкция|дизъюнкцией]] потому, что они очень похожи по свойствам, и обе имеют сходство с союзом «или» в повседневной речи. Сравните правила для этих операций:


# <math>A \lor B</math> истинно, если истинно <math>~A</math> ''или'' <math>~B</math>, ''или'' оба сразу.
# <math>A \lor B</math> истинно, если истинно <math>A</math> ''или'' <math>B</math>, ''или'' оба сразу («''хотя бы'' один из двух»).
# <math>A \oplus B</math> истинно, если истинно <math>~A</math> ''или'' <math>~B</math>, но ''не'' оба сразу.
# <math>A \oplus B</math> истинно, если истинно <math>A</math> ''или'' <math>B</math>, но ''не'' оба сразу («''только'' один из двух»).
Операция <math>\oplus</math> ''исключает'' последний вариант («оба сразу») и по этой причине называется исключающим «ИЛИ».
Операция <math>\oplus</math> ''исключает'' последний вариант («оба сразу») и по этой причине называется исключающим «ИЛИ».
Операция <math>\lor</math> ''включает'' последний вариант («оба сразу») и по этой причине иногда называется включающим «ИЛИ».
Операция <math>\lor</math> ''включает'' последний вариант («оба сразу») и по этой причине иногда называется включающим «ИЛИ».
''Неоднозначность'' естественного языка заключается в том, что союз «или» может применяться в обоих случаях.
''Неоднозначность'' естественного языка заключается в том, что союз «или» может применяться в обоих случаях.


== [[Квантовые вычисления]] ==
== Квантовые вычисления ==
В [[квантовый компьютер|квантовых компьютерах]] аналогом операции сложения по модулю 2 является [[квантовый вентиль|вентиль]] [[CNOT]].
В [[квантовый компьютер|квантовых компьютерах]] аналог операции сложения по модулю 2 — [[квантовый вентиль|вентиль]] [[CNOT]].

== Цифровая техника ==
[[Файл:Микросхема К155ЛП5 (7486).jpg]]


== См. также ==
== См. также ==
* [[Тождественное отображение|Идентичность]]
* [[Булева функция#Тернарные функции|Тернарное сложение по модулю 2]]
* [[Отрицание]]
* [[Деление по модулю]]
* [[Конъюнкция]]
* [[Алгоритм обмена при помощи исключающего ИЛИ]]
* [[Дизъюнкция]]
* [[Эквиваленция]]
* [[Импликация]]
* [[Обратная теорема|Обратная импликация]]
* [[Штрих Шеффера]]
* [[Стрелка Пирса]]
* [[Таблица истинности]]
* [[Закон тождества]]

== Примечание ==
{{Примечания}}


== Внешние ссылки ==
== Ссылки ==
* [http://alglib.sources.ru/articles/logic.php#xor Алгебра логики и цифровые компьютеры: Функция сложения по модулю 2 (xor)]
* [https://web.archive.org/web/20091231051545/http://alglib.sources.ru/articles/logic.php#xor Алгебра логики и цифровые компьютеры: Функция сложения по модулю 2 (xor)]


{{refless}}
{{refless|дата=2012-05-29}}


{{Булева алгебра}}
{{Булева алгебра}}
Строка 141: Строка 169:
[[Категория:Математические операции]]
[[Категория:Математические операции]]
[[Категория:Логические операции]]
[[Категория:Логические операции]]
[[Категория:Булева алгебра]]
[[Категория:Двоичная арифметика]]
[[Категория:Двоичная арифметика]]

Текущая версия от 14:09, 6 апреля 2024

Исключающее «или»
Сложение по модулю 2, XOR
Диаграмма Венна
Диаграмма Венна
Таблица истинности
Логический вентиль
Нормальные формы
Дизъюнктивная
Конъюнктивная
Полином Жегалкина
Принадлежность предполным классам
Сохраняет 0 Да
Сохраняет 1 Нет
Монотонна Нет
Линейна Да
Самодвойственна Нет
График побитового исключающего «или»

Исключа́ющее «или» (сложе́ние по мо́дулю 2, XOR, строгая дизъюнкция, поразрядное дополнение, инвертирование по маске, жегалкинское сложение, логическое вычитание, логи́ческая неравнозна́чность) — булева функция, а также логическая и битовая операция, в случае двух переменных результат выполнения операции истинен тогда и только тогда, когда один из аргументов истинен, а другой — ложен. Для функции трёх (тернарное сложение по модулю 2) и более переменных — результат выполнения операции будет истинным только тогда, когда количество аргументов, равных 1, составляющих текущий набор, — нечётное. Такая операция естественным образом возникает в кольце вычетов по модулю 2, откуда и происходит название операции.

Сложение по модулю 2 называется «исключающим „или“» и «строгой дизъюнкцией» для отличения от «обычного» (неисключающего) логического «или» — нестрогой логической дизъюнкции. В теории множеств сложению по модулю 2 соответствует операция симметрической разности двух множеств.

Инверсией исключающего «или» является эквиваленция.

Обозначения

[править | править код]

Запись может быть префиксной («польская запись») — знак операции ставится перед операндами, инфиксной — знак операции ставится между операндами и постфиксной — знак операции ставится после операндов. При числе операндов более двух префиксная и постфиксная записи экономичнее инфиксной записи. Чаще всего встречаются следующие варианты записи:
^ , a ≠ b, a<>b, a!=b, , a XOR b

В Юникоде есть символы для сложения по модулю 2: U+22BB xor, U+2295 circled plus и U+2A27 plus sign with subscript two, U+2A52 logical or with dot above, а также символ для суммы по модулю 2: U+2A0A modulo two sum.

Булева алгебра

[править | править код]

В булевой алгебре сложение по модулю 2 — это функция двух, трёх и более переменных (они же — операнды операции, они же — аргументы функции). Переменные могут принимать значения из множества . Результат также принадлежит множеству . Вычисление результата производится по простому правилу, либо по таблице истинности. Вместо значений может использоваться любая другая пара подходящих символов, например или или «ложь», «истина», но при этом необходимо доопределять старшинство, например, .

Двумерная (двухаргументная, двухкоординатная) диаграмма (двумерный массив) истинности из четырёх ячеек:

x⊕y = x XOR y = x<>y = x!=y = x^y
y
1  0  
0  1 x

на которой сразу видно, что функция симметрична относительно главной диагонали.

Таблицы истинности:

0 0 0
0 1 1
1 0 1
1 1 0

Правило: результат равен , если оба операнда равны; во всех остальных случаях результат равен .

0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
1 1 1 1

Правило: результат равен , если количество операндов равных чётное (ноль также является чётным числом), в остальных случаях результат равен .

Программирование

[править | править код]

В языках C/C++, Java, C#, Ruby, PHP, JavaScript, Python и т. д. битовая операция поразрядного дополнения обозначается символом «^», в языках Паскаль, Delphi, Ada, Turbo Basic, Visual Basic — зарезервированным словом xor, в языке ассемблера — одноимённой логической командой. При этом сложение по модулю 2 выполняется для всех битов левого и правого операнда попарно. Например,

если

то

Выполнение операции исключающее «или» для значений логического типа (true, false) производится в разных языках программирования по-разному. Например, в Delphi используется встроенный оператор XOR (пример: условие1 xor условие2). В языке C, начиная со стандарта C99, оператор «^» над операндами логического типа возвращает результат применения логической операции XOR. В C++ оператор «^» для логического типа bool возвращает результат согласно описанным правилам, для остальных же типов производится его побитовое применение.

Использование побитового исключающего «или» позволяет поменять местами значения целых переменных без использования дополнительной памяти.

Криптография

[править | править код]

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

При этом алгоритм шифрования представляет собой только одну операцию – исключающее «или»:

Для дешифровки шифротекста алгоритмом исключающее «или» применяют ещё раз:

Важно понимать, что в случае, если попытаться использовать одинаковые ключи для шифрования более чем одного сообщения на основании исключающего «или», то криптографическая стойкость системы будет нарушена.

Помимо одноразового блокнота, операция исключающего «или» получила распространение во многих криптографических системах и алгоритмах включая DES, AES и других.

Связь с естественным языком

[править | править код]

В естественном языке операция «сложение по модулю» эквивалентна двум выражениям:

  1. «результат истинен (равен 1), если A не равно B (A≠B)»;
  2. «если A не равно B (A≠B), то истина (1)».

Часто указывают на сходство между сложением по модулю 2 и конструкцией «либо … либо …» в естественном языке. Составное утверждение «либо A, либо B» считается истинным, когда истинно/ложно либо A, либо B поодиночке, но не оба сразу; в противном случае составное утверждение ложно. Это в точности соответствует определению операции в булевой алгебре, если «истину» обозначать как , а «ложь» как .

Эту операцию нередко сравнивают с дизъюнкцией потому, что они очень похожи по свойствам, и обе имеют сходство с союзом «или» в повседневной речи. Сравните правила для этих операций:

  1. истинно, если истинно или , или оба сразу («хотя бы один из двух»).
  2. истинно, если истинно или , но не оба сразу («только один из двух»).

Операция исключает последний вариант («оба сразу») и по этой причине называется исключающим «ИЛИ». Операция включает последний вариант («оба сразу») и по этой причине иногда называется включающим «ИЛИ». Неоднозначность естественного языка заключается в том, что союз «или» может применяться в обоих случаях.

Квантовые вычисления

[править | править код]

В квантовых компьютерах аналог операции сложения по модулю 2 — вентиль CNOT.

Цифровая техника

[править | править код]

Примечание

[править | править код]
  1. Шило В.Л. Популярные цифровые микросхемы: Справочник.— М.: Радио и связь, 1987. — 352 с. — (Массовая радиобиблиотека. Вып. 1111).

Внешние ссылки

[править | править код]