LINUX.ORG.RU

Есть ли отличие между XOR и != ?

 ,


0

1

Привет. Смотрю я таблицу истинности для xor и вижу что истина получается только тогда когда два опаренда отличаются, то-есть получается что таблица истинности совпадает у XOR и «не равно». Отсюда вопрос: есть ли ситуацию когда логическое xor отличается от «не равно» или xor это лишняя конструкция?

Не знаю, про какой ты язык, но в C++ xor - битовая операция (когда битов много). Для bool аргументов, xor и != дают одинаковый результат (поэтому, в C++ логический xor не определен).

anonymous
()

Смотрю я таблицу истинности для xor и вижу что истина получается только тогда когда два опаренда отличаются, то-есть получается что таблица истинности совпадает у XOR и «не равно». Отсюда вопрос: есть ли ситуацию когда логическое xor отличается от «не равно» или xor это лишняя конструкция?

Судя по тегам, ты спрашиваешь не про какой-то конкретный ЯП, а про логику вообще.

Так вот, XOR (оно же - сложение по модулю 2) определено для любого числа аргументов. А логических функций N переменных вагон и маленькая тележка (см. вики).
И нет ничего странного в том, что таблицы истинности каких-то двух из них совпали при N = 2.
Уже для N = 3 они отличаются: XOR(1, 1, 0) = 0, но NOT_EQ(1, 1, 0) = 1

Crocodoom ★★★★★
()

или xor это лишняя конструкция?

А ещё or — «лишняя инструкция», т.к. a or b = not(not(a) and not(b))

В советские времена всю логику, бывало, собирали на К155ЛА3, которая = not(a and b) :)

...

Скажу по секрету, ещё в программировании или циклы, или условия лишние. Можно обойтись только одним :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Crocodoom

Ещё пример совпадения функций:

Логическую импликацию {0→0 = 1, 1→0 = 0, 0→1 = 1, 1→1 = 1} можно заменить на «меньше либо равно»: x→y ≡ x≤y

Crocodoom ★★★★★
()
Ответ на: комментарий от KRoN73

Предлагаешь циклы заменить на if с goto?

з.ы. а ещё рекурсия лишняя, так как может быть развёрнута в цикл.

з.ы. по сабжу - они эквивалентны только для булевого типа. Для какого-нибудь uint-а - неравенство будет выражением типа or_{i=size(type)} {xor(value1_i, value2_i)}. Что явно не XOR.

anonymous
()

Я просто задумался над созданием своего ЯП и встал перед вопросом: какие логические операторы мне нужны. В логике есть AND, OR, XOR, импликация, эквиваленция, штрих шеффера, стрелка пирса, отрицание. Причём во многих ЯП отсутствуют логические XOR, импликация,штрих шеффера, стрелка пирса и ничего, живут люди. Я же решил что все эти операторы у меня будут, единственно только насчёт xor сомневаюсь.

russian-turist-2019
() автор топика
Ответ на: комментарий от russian-turist-2019

Я просто задумался над созданием своего ЯП

для тебя есть уже раст

not_rj45
()

есть ли ситуацию когда логическое xor отличается от «не равно»

a ^^ b ^^ c

a !=b != c

UB, насколько понимаю..по крайней мере абсолютно бессмысенно

MKuznetsov ★★★★★
()

Ты собрался сравнивать операции на операндах длиной в один бит, и делать выводы о лишнести, лолка? Ничего что они немного применимы к числам произвольной длины, и для числа бит > 1 результат уже отличается? А != применим не только к числам.

slovazap ★★★★★
()
Ответ на: комментарий от russian-turist-2019

Конечно про битовую, xor в доисторические времена использовали как операцию сравнения так как она выполнялась за один такт и была быстрой, еще финт типа xor ax,ax для обнуления ax тоже быстрее и короче mov ax,0, так что не выбрасывай лишнюю конструкцию, можешь запутывать вероятного противника.

ilovewindows ★★★★★
()

Привет. Смотрю я таблицу истинности для или и вижу что истина получается только тогда когда хотя бы 1 операнд верен, то-есть получается что таблица истинности совпадает у или и комбинации штрихов шеффера (X|X)|(Y|Y). Отсюда вопрос: есть ли ситуацию когда логическое или отличается от (X|X)|(Y|Y) или или это лишняя конструкция?

hlebushek ★★
()
Последнее исправление: hlebushek (всего исправлений: 1)
Ответ на: комментарий от anonymous

Только хвостовая

Не только, если перенести стэк в кучу, например.

korvin_ ★★★★★
()
Ответ на: комментарий от hlebushek

комбинации штрихов шеффера (X|X)|(Y|Y)

Знак | принят для логического ИЛИ, так что требуется время, чтобы вдуматься в вашу запись. Зачем, если есть отдельный знак - ⊼ (U+22BC)?

Отсюда вопрос: есть ли ситуацию когда логическое или отличается от (X|X)|(Y|Y) или или это лишняя конструкция?

Смотрите законы де Моргана. (Вообще при таком проектировании Вы должны были их знать и ночью посреди сна...) Ваше X⊼X становится просто логической инверсией (NOT). Операция NOT AND(NOT X, NOT Y) идентична OR(X,Y); поэтому ответ - нет, ситуация не отличается.

А вот лишняя ли конструкция - зависит от того, целью является минимизация или предоставление удобного набора; эти цели друг другу немного противоречат. Минимизация реально сделана в большинстве схемотехник современной электроники, где самая дешёвая операция - NOT AND на любое количество входов, а остальные заметно дороже по количеству элементов или медленнее работают. Можете считать, что в процессоре, который давал вам читать этот комментарий, именно так и сделано. Но человеку удобнее работать через явный набор AND, OR, XOR, NOT.

netch
()
Ответ на: комментарий от Crocodoom

Так вот, XOR (оно же - сложение по модулю 2) определено для любого числа аргументов.

У «исключающего ИЛИ» есть другое, конфликтующее с этим определение - «1 и только 1». Оно используется, например, в Perl6 (оператор «^^»). Поэтому в общем случае надо уточнять, какой из двух XOR имеется в виду.

netch
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.