web-dev-qa-db-fra.com

Remplacement de "==" avec des opérateurs bitwises

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;
}
25
not_l33t

Deux nombres sont égaux s'il n'y a pas de différence entre eux:

int equal(int x, int y){
   return !(x-y);
}
23
sth

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);
71

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.)

3
indiv

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);
}
1
Saurabh Sachdeo

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) );
0
Eternal Learner