une fonction pour vérifier si le n-ième bit est défini dans un octet
Je veux une simple fonction C qui retourne true si la n-ième bit d'un octet est fixé à1
. Sinon, elle retourne la valeur false.
C'est une fonction essentielle en termes de temps d'exécution, je suis à la pensée de la manière la plus optimale pour le faire.
- en double, stackoverflow.com/questions/523724/...
- Ce n'est pas dupe, elle a demandé en particulier à propos de non-bitshift méthodes.
Vous devez vous connecter pour publier un commentaire.
La fonction suivante peut faire ce que vous avez besoin de:
Cela suppose octets de 8 bits (pas en C) et le zéro bit étant le plus élevé en commander une. Si ceux hypothèse est incorrecte, il revient simplement à l'expansion et/ou la réutilisation de la commande de l'
mask
tableau.Pas de contrôle d'erreur est le fait depuis que vous avez cité vitesse que la considération la plus importante. Ne pas passer dans un invalide
n
, ça va être un comportement indéterminé.Au fou optimisation du niveau de
-O3
, gcc nous donne:ce qui est assez petite et efficace. Et si vous faites, il est statique et suggèrent d'inlining ou de le forcer en ligne, comme une définition de macro, vous pouvez même ignorer le coût d'un appel de fonction.
Assurez-vous de référence de n'importe quelle solution vous est donnée, y compris celui-ci a. Le numéro un mantra dans l'optimisation de "la Mesure, ne pas le deviner!"
Si vous voulez savoir comment les opérateurs au niveau du bit, voir ici. La procédure simplifiée ET la version est ci-dessous.
L'opération
&
permettra de définir un peu dans la cible uniquement si les deux bits sont définis dans le tewo sources. Le tableau est:Pour un
char
valeur, nous utilisons le seul bit de masques de bits pour vérifier si un bit est défini. Disons que vous avez de la valeur 13 et vous voulez voir si le troisième-de-moins-bit est réglé.Vous pouvez voir que tous les zéro des bits dans le masque de résultat dans le résultat équivalent bits à zéro. Le seul bit du masque va laisser l'équivalent de bits dans le flux de valeur par le résultat. Le résultat est zéro si le bit nous sommes vérification a été nulle ou non nulle si c'en était une.
C'est là l'expression de la
return
déclaration de vient de. Les valeurs dans lamask
table de recherche sont tous les la seule des masques de bits:a je sais comment je suis bon, mais vous n'avez pas 🙂
mask[]
initialisée entrées.-O0
(aucun) a obtenu par le biais d'un million de contrôles dans les quatre millièmes de seconde, c'est deux cent cinquante millions de fois par seconde (bien que, certes, c'est un grunty octo-core de développement de la zone). Si vous avez besoin de mieux que la, puis, par tous les moyens, de choisir une solution plus rapide. Personnellement, je doute qu'il serait nécessaire, sauf dans les cas les plus extrêmes.!= 0
partie de votre instruction de retour, depuisc & mask[n]
par lui-même donne le retour de la valeur. Si je ne me trompe pas, cela vous fera économiser de deux de vos instructions machine,setne
etmovzbl
.testb/setne
est remplacé par unandb
- si c'est une amélioration, je ne pouvais pas le dire sur le dessus de ma tête, mais c'est probablement le cas. J'ai bien gcc était plus intelligente que ça.Il suffit de vérifier la valeur de
(1 << bit) & byte
. Si elle est différente de zéro, le bit est défini.Laisser le numéro de
num
. Alors:unsigned char
pour la valeur de l'octet, maisn
? Qui me semble bizarre.unsigned char
ne contraignent pas n aux valeurs valides, je dirais que c'est un [petit] "odeur de code, en ce qui concerne la lisibilité. Bien sûr, c'est discutable, et je suis d'accord il n'a pas beaucoup d'importance.Une autre approche serait de