Quelqu'un peut-il s'il vous plaît expliquer comment cela fonctionne (ASZ + 7) & ~ 7; Il arrondit ASZ au multiple supérieur supérieur de 8.
Il est facile de voir que ~ 7 produit 11111 000 (représentation 8 bits) et éteint donc les 3 derniers bits, donc tout nombre qui est produit est un multiple de 8. P>
Ma question est de savoir comment ajouter ASZ à 7 avant de masquer [EDIT] produire le multiple [fin d'exécution] suivant de 8? J'ai essayé de l'écrire sur papier p>
J'aime: P>
1 + 7 = 8 = 1|000 (& ~7) -> 1000 2 + 7 = 9 = 1|001 (& ~7) -> 1000 3 + 7 = 10 = 1|010 (& ~7) -> 1000 4 + 7 = 11 = 1|011 (& ~7) -> 1000 5 + 7 = 12 = 1|100 (& ~7) -> 1000 6 + 7 = 13 = 1|101 (& ~7) -> 1000 7 + 7 = 14 = 1|110 (& ~7) -> 1000 8 + 7 = 15 = 1|111 (& ~7) -> 1000
7 Réponses :
Eh bien, le masque produirait un multiple exact de 8 par lui-même. L'ajout de 7 à asz garantit que vous obtenez le Suivant em> plus grand multiple. P>
Il ajoute réellement 7 au nombre et arrondi vers le bas em>. p>
Ceci a l'effet souhaité de l'arrondi jusqu'au prochain multiple de 8. (Ajout +8 au lieu de +7 cognerait une valeur de 8 à 16.) P>
Incidemment, cette astuce ne fonctionnera pas si le nombre que vous souhaitez arrondi sur un multiple n'est pas un multiple de la base du nombre. Version courte: Vous ne pouvez pas ajouter 8 et aller à 9, mais vous pouvez ajouter 15 et 16 rounder.
@ Joost Si vous êtes à un multiple de 8, l'ajout de 8, puis arrondi, vous allez vous heurter au multiple suivant de 8. Cela ne fonctionnera pas.
Oui, je ne suis pas sûr de ce que je pensais (toutes ces années auparavant). Je vais supprimer mon commentaire.
Eh bien, si vous essayiez de ronder Down em>, vous n'avez pas besoin de l'addition. Juste faire l'étape de masquage effacerait les bits inférieurs et vous seriez arrondi au prochain multiple inférieur. Si vous voulez arrondi up em>, vous devez d'abord ajouter suffisamment pour "passer au-delà" le prochain multiple de 8. Puis la même étape de masquage vous ramène vers le multiple de 8. Le Raison que vous choisissez 7 est que c'est le seul numéro garanti d'être "assez gros" de vous faire passer de n'importe quel nombre au-delà du prochain multiple de 8 sans augmenter un multiple supplémentaire si votre numéro d'origine était déjà un multiple de 8. P > en général, pour arrondir jusqu'à une puissance de deux: p>
Arrondir un entier N jusqu'à tout entier M peut être atteint avec (n / m) * M code>
Le bit & ~ code> ne fonctionne que si le tour de tour est une puissance de 2. En général, vous devez avoir besoin
retour ((valeur + rond-pied - 1) / rond-rond) * rond-ce que ce soit. Code>.
@Gregrogers, avez-vous une idée de la coût d'une instruction de division?
Le +7 n'est pas de produire un multiple exact de 8, pour vous assurer d'obtenir le plus grand nombre maximum de huit le plus élevé. P>
Modifier: battu de 16 secondes et plusieurs ordres de qualité. Oh bien, retour à la mort. P>
euhh, vous venez de répondre à votre propre question ??? En ajoutant 7, vous garantissez le résultat durera ou au-dessus du prochain multiple de 8. Tronquable vous donne alors que plusieurs. P>
sans le +7, ce sera le plus gros multiple de 8 moins ou égal à votre numéro d'origine p>
L'ajout 7 ne produit pas de plusieurs multiples de 8. Le multiple de 8 est produit par anding avec ~ 7. ~ 7 est le complément de 7, qui est 0xFFFFF FFF8 (sauf que de nombreux bits sont dans un int). Cela tronque, ou des tours en bas. P>
Ajout 7 Avant de le faire, cela assure qu'aucune valeur inférieure à celle de ASZ n'est renvoyée. Vous avez déjà travaillé de savoir comment cela fonctionne. P>