Quel est le moyen le plus rapide pour savoir si un nombre est pair ou impair?
Quel est le moyen le plus rapide pour savoir si un nombre est pair ou impair?
- C'est un bon débutant C question. +1 de moi.
- N'est pas au niveau du bit-XOR plus rapide que bit-à-bit-ET? Il n'est pas possible avec l'opération XOR?
- Si vous êtes en utilisant une fonction de compilateur, que back-end presque certainement le sait ces trucs mieux que vous. Écrire pour la clarté et de la lisibilité et de laisser le peu de violon, cycle de l'optimisation du pro. Vraiment. Et si vous n'êtes pas heureux avec les résultats, le profil, puis examiner les points chauds dans le détail.
- De toute façon j'aimerais voir une solution à l'aide d'une seule instruction XOR. Je ne pense pas que ce soit possible...
- Assurez-vous que vous avez lu avant de microoptimization: linux-kongress.org/2009/slides/...
- Non, il n'est pas possible de modèle ET en utilisant uniquement XOR. Vous ne pouvez pas masquer bits XOR - vous ne pouvez passer à l'identique, ou basculer.
Vous devez vous connecter pour publier un commentaire.
Il est assez bien connu que
est plus efficace que
Mais avec l'optimiseur de suite, sera
is_odd_B
pas être différente deis_odd_A
? Pas — avecgcc-4.2 -O2
, nous obtenons, (dans les BRAS de montage):Nous voyons que
is_odd_B
prend 3 plus d'instructions queis_odd_A
, la principale raison est parce queCependant, toutes les versions suivantes génère le même code que
is_odd_A
:Qu'est-ce que cela signifie? L'optimiseur est généralement assez sophistiqué que, pour ces choses simples, le plus clair de code est suffisant pour garantir une meilleure efficacité.
unsigned
.x&1U
. 🙂x & 1
va donner de mauvaises réponses sur un complément de systèmes. Pour le portable code qui permet de compiler efficacement sur la normale complément de 2 systèmes qui nous intéressent, vous devez utiliser signé oux % 2 != 0
Manière habituelle de le faire:
Alternative:
Testé sur GCC 3.3.1 et 4.3.2, les deux ont la même vitesse (sans optimisation du compilateur) comme la fois le résultat de la
and
instruction (compilé sur x86) - je sais que l'utilisation de ladiv
instruction pour modulo serait beaucoup plus lent, donc je n'ai pas de test du tout.gcc
sans options est équivalent àgcc -O2
qui est un non-trivial niveau de l'optimisation de la vitesse. Vérifier l'assembly généré pour être sûr..1
à1U
.if (x & 1) est vrai, alors c'est bizarre, sinon c'est le même.
i
est signé.Si c'est un entier, probablement par juste vérifier le bit le moins significatif. Zéro sera compté comme même si.
La portable façon est d'utiliser l'opérateur de modulo
%
:Si vous savoir que vous n'êtes jamais allez courir sur le complément à deux architectures, vous pouvez utiliser un bit à bit et:
En utilisant le module de l'opérateur peut entraîner une baisse de code par rapport à la bit-à-bit; et cependant, je serais rester avec elle, à moins que toutes les conditions suivantes sont remplies:
x % 2
un beaucoup (disons dans une boucle serrée, qui est exécuté des milliers de fois);==
a une priorité plus élevée que&
, doncx & 0x01 == 0
permettra d'évaluer dansx & (0x01 == 0)
qui est équivalent àx & 0
qui signifie0
de sorte que votreif
branche ne sera jamais exécutée.Vérifier pour voir si le dernier bit est à 1.
Oh, attendez, vous avez dit plus rapide façon, pas plus drôle. Mon mauvais 😉
Fonction ci-dessus ne fonctionne que pour les nombres positifs, bien sûr.
{return n & 1;}
🙂Votre question n'est pas complètement spécifié. Peu importe, la réponse dépend de votre compilateur et de l'architecture de votre machine. Par exemple, êtes-vous sur une machine à l'aide d'un complément ou en complément à deux signé nombre de représentations?
J'écris mon code pour être correct tout d'abord, effacer deuxième, concis troisième et rapide dernier. Par conséquent, je voudrais le code de cette routine comme suit:
Cette méthode est correcte, il exprime plus nettement l'intention de tester le bit de poids faible, c'est concis et, croyez-le ou pas, il est ultra-rapide. Si et seulement si le profilage m'a dit que cette méthode ont été un goulot d'étranglement dans mon application je envisager de s'en écarter.
Vérifier le bit le moins significatif:
0x01
au lieu de simplement1
?