J'ai trouvé un peu plus intéressant Twiddling dans "Source \ Common \ Unicode \ utf.h" Code> Fichier de la bibliothèque ICU (composants internationaux pour Unicode). Le bit TwidDling est destiné à vérifier si un numéro est dans une plage particulière.
MagicNumber = 0xffffffff - (HighBound - LowBound)
3 Réponses :
Pour que ces astuces appliquent, les chiffres doivent avoir des caractéristiques communes dans leur représentation binaire. Qu'est-ce que ce test est vraiment pour masquer les dix bits inférieurs. Ceci est généralement écrit comme p> après cette opération ("et non") Les dix bits inférieurs de Cet astuce fonctionne dans tous les cas où la limite inférieure et supérieure de l'intervalle commence avec le mêmes chiffres en binaire, et à un moment donné, la limite inférieure n'a que des zéros tandis que la limite supérieure n'a que des celles-ci. Dans votre exemple, c'est à la dixième position de la droite. P> p> seulhighbits code> sont garantis à zéro. Cela signifie que si ce nombre est égal à la plage inférieure de l'intervalle maintenant, il a été quelque part dans l'intervalle précédent. P>
Pouvez-vous fournir des références pour "généralement écrit comme"? Personnellement, je trouve a & ~ b code> au lieu de
a & ~ b code> moins intuitif et
a & b == C code> plus intuitif que
a & ~ d == e code> car il y a moins d'opérations même si c'est juste ma préférence personnelle.
Sachez que A & B == C code> ne signifie pas ce que vous pensez probablement que cela signifie (cela signifie
a & (b == c) code>).
A & ~ B CODE> est lexiquement identique à
A & B CODE>, et je conviens que ce dernier est une meilleure transcription de celui-ci, si seulement parce que c'est comme ça que c'est comme ça que c'est comme ça que c'est habituellement.
La formule fonctionne chaque fois que la plage que vous recherchez commence à un multiple d'une puissance de 2 (c'est-à-dire, 1 ou plusieurs bits à la fin bas de la forme binaire du numéro se termine dans 0) et la taille de la taille de la la plage est 2 ^ n-1 (c'est-à-dire, faible et élevé == basse et basse | HIGH == HIGH). P>
L'avez-vous testé? Supposant que le numéro est 9 code> et la plage est
8..8 + (2 ^ 14-1) code>, la formule ne s'applique pas à ce cas.
Eh bien ... Le N doit être plus grand que le nombre de 0 à la fin du numéro de base (donc pour 8, N pourrait être compris entre 1 et 3). Je pensais que ce sera trop évident pour mentionner.
Si vous n'avez pas de type 2 ^ x limites, vous pouvez utiliser le truc suivant:
si Cela fonctionne en raison du fait que des nombres négatifs dans des numéros signés correspondent aux plus gros numéros de types de données non signés. P> Vous pouvez prolonger ceci (quand La vérification de la plage est désactivée) à: p> Vous avez maintenant les deux tests (plage Je n'utilise que ces types d'optimisations lorsque vraiment em> nécessaires; Par exemple, ils ont tendance à rendre votre code moins lisible et il ne fait que raser quelques cycles d'horloge par test. P> Note à C comme Lampe Lecteurs: Le longword est le type de données de 32 bits de Delphi. P> p> x> = 0 code> et
x
[A, B> code>) dans un sous et un CMP plus un Single JCC, en supposant (B - A) est préalculé. p>
Merci@ritsaert, +1 de moi.
Pour les gammes arbitraires, vous aurez besoin d'une méthode différente: moyen le plus rapide de déterminer si un entier est compris entre deux entiers (inclus) avec des ensembles connus de valeurs