¿alguien puede explicar cómo funciona esto? (Asz + 7) & ~ 7; Redondea asz al siguiente múltiplo más alto de 8.Bit Hack - Redondee a múltiples de 8
Es fácil ver que ~ 7 produce 11111000 (representación de 8 bits) y por lo tanto desconecta los últimos 3 bits, por lo tanto, cualquier número que se produzca es un múltiplo de 8
Mi pregunta es ¿cómo la adición de asz a 7 antes de enmascarar [editar] produce el siguiente más alto [editar final] múltiplo de 8? He intentado escribir en un papel
como:
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
Un patrón parece emerger con claridad a la que ha sido explotado .Can alguien por favor me ayude a cabo?
Gracias a todos por las respuestas. Me ayudó a confirmar lo que estaba pensando. Continué escribiendo el patrón de arriba y cuando crucé 10, pude ver claramente que los números se promocionan al siguiente "bloque de 8" si puedo decirlo.
Gracias de nuevo.
redondeando un entero n hasta cualquier número entero m se puede lograr con '(n/m) * m' –
El bit' & ~ 'solo funciona si el roundTo es una potencia de 2. En general, se necesita' return ((value + roundTo - 1)/roundTo) * roundTo; 'en su lugar. –
@GregRogers, ¿tiene alguna idea de lo costosa que es una instrucción dividida? – Johan