Question

Comment faites-vous l'opération XOR si bitwise vous avez uniquement disponible AND et OR opérations?

Était-ce utile?

La solution

Créer ma propre langage de script - ChrisScript - vous juste besoin quelque chose comme:

#!/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;
}

Même sans pas, il peut être émulé comme ça. Mais c'est la meilleure solution que vous allez obtenir sans avoir une certaine forme de l'onduleur. Je trouve difficile de croire que vous n'avez pas une certaine forme d'onduleur availble - quel environnement de script que vous utilisez

Autres conseils

Table de vérité pour ET

  
  A  B  AND
  T  T  T
  T  F  F
  F  T  F
  F  F  F
  

Table de vérité pour OU

  
  A  B  OR
  T  T  T
  T  F  T
  F  T  T
  F  F  F
  

Table de vérité pour XOR

  
  A  B  XOR
  T  T  F
  T  F  T
  F  T  T
  F  F  F
  

Alors, XOR est comme OU, sauf qu'il est faux si A et B sont vraies.

, (A ou B) ET (NON (A et B)), qui est (A ou B) et (A NON 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
  

Je ne sais pas si elle peut se faire sans pas ou NON

"Les systèmes ({T, F}, et) et ({T, F} ou) sont monoids."

"Le système ({T, F}, XOR) est un groupe abélien" qui a la propriété de inversibilité contrairement monoids.

Par conséquent, 'et' et 'ou' ne parviennent pas à construire 'XOR' opération.

Source: https://en.wikipedia.org/wiki/Exclusive_or#Relation_to_modern_algebra

Si vous avez des opérateurs arithmétiques tels que + et - en plus au niveau du bit (&) et OR (|), vous pouvez le faire XOR comme ceci:

int bitwise_XOR(int a, int b)
{
    return (a + b) - (a & b) - (a & b);
}

La raison pour laquelle cela fonctionne est que nous faisons un complément complet, ce qui équivaut à XOR lorsque la somme de position de bit donnée amy est <= 1, puis nous corrigeons le cas où un report est généré (1 + 1) en soustrayant 2 * (a & b).

Notez que cela fonctionne même lorsque le dépassement des conditions intermédiaires, en supposant que nous avons « normalement se comportait » des entiers (le complément de 2, 2 modulo enveloppant pour trop-plein, etc.).

entrée Wikipedia sur XOR va plus en détail. Probablement une bonne première place pour vérifier avant aksing une question SO.

Si vous avez déjà des bits que vous ne se soucient pas masquée, il me semble la meilleure façon de le faire (pour autant que l'écriture du code va de toute façon) est d'utiliser simplement votre opérateur pas égal.

(a XOR b) = ((a OR b) - (a AND b)), ou en d'autres termes, l'ensemble des syndicats moins l'ensemble d'intersection.

Exemple de code (en javascript):

var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9

Dans C: x ^ y = (x & ~y) | (~x & y)

Je suis assez sûr que la formule ci-dessous est correcte:

a xor b = pas ((a et b) ou non (a + b))

Le meilleur conseil est de rechercher XOR dans les manuels de référence et sites encyclopédie sur le code net, puis d'écrire ou d'un script qui fait la même chose que la description de ce qu'est un XOR fonction intégrée ne et utiliser vos propres valeurs de retour ou de statut. Nous ne pouvons pas vous dire comment faire ce type de bits compare au sein de la communauté du logiciel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top