Xor от только или и и
-
12-10-2019 - |
Вопрос
Как вы выполняете операцию XOR BITWISE, если у вас есть только доступные и или операции?
Решение
Создание собственного языка сценариев - Chrisscript - вам просто нужно что -то вроде:
#!/bin/chrish
bit XOR (bit A, bit B)
{
bit notA;
bit notB;
IF (A == 0) notA = 1 ELSE notA = 0;
IF (B == 0) notB = 1 ELSE notB = 0;
F = ((A && notB) || (notA && B));
RETURN F;
}
Даже без нет, его можно подражать так. Но это лучшее решение, которое вы получите, не имея какой -либо формы инвертора. Мне трудно поверить, что у вас нет никакой формы инвертора, доступной - какую среду сценариев вы используете?
Другие советы
Таблица правды для и
A B AND T T T T F F F T F F F F
Таблица правды для или
A B OR T T T T F T F T T F F F
Таблица истины для XOR
A B XOR T T F T F T F T T F F F
Итак, XOR просто как или, кроме того, что он ложный, если A и B верны.
Итак, (a или b) и (не (a и b)), то есть (a или b) и (a nand b)
A B OR AND NAND [(A OR B) AND (A NAND B)] T T T T F F T F T F T T F T T F T T F F F F T F
Не уверен, можно ли это сделать без
«Системы ({t, f} и) и ({t, f}, или) являются моноидами».
«Система ({t, f}, Xor) - это абелевская группа», которая обладает свойством инвертибильности в отличие от моноидов.
Следовательно, «и» и «или» не могут построить операцию «XOR».
Источник: https://en.wikipedia.org/wiki/exclusive_or#relation_to_modern_algebra
Если у вас есть арифметические операторы, такие как +
а также -
в дополнение к бить и (&
) и или (|
) тогда вы можете сделать кусочек, как это:
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
Причина, по которой это работает, заключается в том, что мы делаем полное добавление, что эквивалентно XOR, когда сумма для полученного битового положения составляет <= 1, а затем мы исправляем случай, когда генерируется перенос (1 + 1) вычитав 2 * (a & b)
.
Обратите внимание, что это работает, даже когда промежуточные термины переполняются, предполагая, что мы «обычно ведем себя» целых числа (комплемент 2, модуль 2 обертывания для переполнения и т. Д.).
Запись Википедии на XOR Проходит это подробно. Вероятно, хорошее первое место, чтобы проверить, прежде чем задать вопрос.
Если у вас уже есть кусочки, которые вам не волнуют, это кажется, мне кажется, что это самый простой способ сделать это (насколько написано код в любом случае) - просто использовать свой оператор, не равный.
(a XOR b) = ((a OR b) - (a AND b))
, или, другими словами, набор союза за вычетом набора пересечения.
Пример кода (в JavaScript):
var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
В C: x ^ y = (x & ~y) | (~x & y)
Я почти уверен, что формула ниже верна:
a xor b = не ((a и b) или нет (a+b))
Лучший совет-найти XOR в справочных руководствах и энциклопедических сайтах в сети, а затем написать код или сценарий, который делает то же самое, что и описание того, что выполняет встроенная функция XOR, и используйте свои собственные значения возврата или статуса. Мы не можем сказать вам, как сделать этот тип бита, сравнивается из сообщества программного обеспечения.