Вопрос

Как вы выполняете операцию 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, и используйте свои собственные значения возврата или статуса. Мы не можем сказать вам, как сделать этот тип бита, сравнивается из сообщества программного обеспечения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top