XOR только от ИЛИ И И
Как вы выполняете битовую операцию XOR, если у вас есть только операции AND и OR?
11 ответов
Создание моего собственного языка сценариев - 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;
}
Даже без НЕ, его можно подражать так. Но это лучшее решение, которое вы получите без инвертора. Мне трудно поверить, что у вас нет какой-либо формы инвертора - какую среду сценариев вы используете?
Таблица правды для AND
ГРУППА ТТТ ПТФ ФТФ FFF
Таблица правды для ИЛИ
AB ИЛИ ТТТ TFT FTT FFF
Таблица правды для XOR
AB XOR TTF TFT FTT FFF
Таким образом, XOR похож на OR, за исключением того, что оно ложно, если A и B истинны.
Итак, (А ИЛИ Б) И (НЕ (А И Б)), то есть (А ИЛИ Б) И (А И Б)
AB ИЛИ И NAND [(A ИЛИ B) И (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
Не уверен, что это можно сделать без NOT или NAND
(a XOR b) = ((a OR b) - (a AND b))
или, другими словами, множество объединения минус множество пересечений.
Пример кода (в javascript):
var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
"Системы ({T, F} и) и ({T, F} или) являются моноидами".
"Система ({T, F}, xor) является абелевой группой", которая обладает свойством обратимости в отличие от моноидов.
Следовательно, 'and' и 'or' не могут создать операцию 'xor'.
Если у вас есть арифметические операторы, такие как +
а также -
помимо побитового И (&
) и ИЛИ (|
) тогда вы можете сделать битовый XOR следующим образом:
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
Причина, по которой это работает, в том, что мы делаем полное добавление, которое эквивалентно XOR, когда сумма для каждой заданной позиции бита <= 1, а затем мы исправляем случай, когда генерируется перенос (1 + 1) вычитая 2 * (a & b)
,
Обратите внимание, что это работает даже тогда, когда промежуточные термины переполняются, предполагая, что у нас есть "нормально себя ведущие" целые числа (дополнение 2, переход по модулю 2 для переполнения и т. Д.).
В статье Википедии о XOR подробно говорится об этом. Вероятно, хорошее первое место, чтобы проверить, прежде чем задавать вопрос SO.
Если у вас уже есть биты, о которых вы не заботитесь, замаскированные, мне кажется, что самый простой способ сделать это (поскольку в любом случае написание кода идет) - это просто использовать ваш оператор равенства.
PrintF('%-10s XOR',[inttobinbyte((10 OR 12)-(12 AND 10))])
00000110 Исключающее ИЛИ
В питоне
...:def xor(a,b):
...: c = (not a) and b
...: d = (not b) and a
...: e = not c
...: f = not d
...: g = e and f
...: h = not g
...: return h
Я уверен, что приведенная ниже формула верна:
a xor b = нет ((a и b) или нет (a+b))
Лучший совет - поискать XOR в справочных руководствах и сайтах энциклопедии в сети, а затем написать код или скрипт, который аналогичен описанию того, что делает встроенная функция XOR, и использовать собственные значения возврата или состояния. Мы не можем рассказать вам, как выполнить этот тип сравнения битов в сообществе разработчиков программного обеспечения.