Utiliser uniquement des opérateurs bitwises (|, &, ~, ^, >>, <<) et d'autres opérateurs de base tels que +, - et!, Est-il possible de remplacer le "==" ci-dessous?
int equal(int x, int y) {
return x == y;
}
Deux nombres sont égaux s'il n'y a pas de différence entre eux:
int equal(int x, int y){
return !(x-y);
}
N'oubliez pas qu'un XOR
est l'exacorme que NOT EQUALS
et XNOR
est exactement le même que EQUALS
. Alors, ce qui suit vous donnera exactement ce que vous voulez:
return !(x ^ y);
Cet exemple est identique à la soustraction, mais est plus explicite quant à la comparaison desquelles certaines architectures enregistrent (comme le bras, je crois).
return !(1 + ~x + y);
Le 1 signifie l'entrée de kit de repère dans l'alu. Un numéro x
est complété sur le bitwise. Prendre le complément et l'ajout de 1 produit le complément du nombre de deux (x
devient -x
), puis il est ajouté à l'autre numéro pour faire la différence pour déterminer l'égalité.
Donc, si les deux chiffres sont égaux, vous obtenez -x + x => 0
.
(Sur un niveau de registre le !
L'opérateur n'est pas terminé et vous ne faites que tester le "bit zéro" des codes de condition ou des drapeaux, qui est défini si l'opération de registre produit le résultat de zéro et est clair autrement.)
AS XOR= est identique à (! =), Donc (x ^ y) retournera 0 uniquement pour des valeurs égales. Ma prise est ce qui suit parce qu'il est sensible, utilise un opérateur de bit-wise et de travailler .
int notEqual(int x, int y){
return (x ^ y);
}
Mon prise sur ça
int equal(int x, int y){
if((x & ~y) == 0)
return 1;
else
return 0;
}
Explication: Si x == y
, alors x & ~y
évalue à 0
retour 1, sinon retourner 0 comme x!=y
.
Edit1: The above is equivalent to
int equal(int x, int y){
return !(x & ~y) ; // returns 1 if equal , 0 otherwise.
}
Le code ci-dessus échoue dans certains cas où le bit le plus significatif passe à 1. La solution consiste à ajouter un 1. I.e bonne réponse est
return !(x & (~y +1) );