qué - C cálculo rápido del próximo múltiplo de 4?
youtube como medio de comunicacion pdf (7)
(myint + 4) y 0xFFFC
¿Qué es una forma rápida de redondear un int
sin firmar a un múltiplo de 4
?
Un múltiplo de 4 tiene los dos bits menos significativos 0, ¿verdad? Así que podría enmascararlos y luego hacer una instrucción de cambio, agregando 1,2 o 3 a la uint
dada.
Esa no es una solución muy elegante ..
También está el resumen aritmético:
myint == 0 ? 0 : ((myint+3)/4)*4
Probablemente hay una mejor manera incluyendo algunas operaciones de bits?
Esto es sin sucursales, generalmente configurable, fácil de entender (si conoce las cadenas de bytes C), y le permite evitar pensar en el tamaño de bit de myInt:
myInt += "/x00/x03/x02/x01"[myInt & 0x3];
El único inconveniente es un posible acceso de memoria única a otro lugar (almacenamiento de cadena estática) que la pila.
Si desea el siguiente múltiplo de 4 estrictamente mayor que myint
, esta solución funcionará (similar a las publicaciones anteriores):
(myint + 4) & ~3u
Si, por el contrario, desea redondear al múltiplo de 4 más cercano (dejando myint
sin cambios si es un múltiplo de 4), esto debería funcionar:
(0 == myint & 0x3) ? myint : ((myint + 4) & ~3u);
Si por "próximo múltiplo de 4" quiere decir el múltiplo más pequeño de 4 que es más grande que su valor int sin signo myint, esto funcionará:
(myint | 0x03) + 1;
Supongo que lo que está intentando lograr es la alineación del número de entrada, es decir, si el número original ya es un múltiplo de 4, entonces no es necesario cambiarlo. Sin embargo, esto no está claro de su pregunta. ¿Quizás quieres el siguiente múltiplo incluso cuando el número original ya es un múltiplo? Por favor, aclarar.
Para alinear un número arbitrario no negativo i
en un límite arbitrario n
solo tiene que hacer
i = i / n * n;
Pero esto lo alineará hacia el infinito negativo. Para alinearlo con el infinito positivo, agregue n - 1
antes de realizar la alineación
i = (i + n - 1) / n * n;
Esto ya es lo suficientemente bueno para todos los propósitos y propósitos. En tu caso seria
i = (i + 3) / 4 * 4;
Sin embargo, si prefiere extraer algunos de los relojes de la CPU, puede usar el hecho de que el i / 4 * 4
puede reemplazarse con un twitdling i & ~0x3
, lo que
i = (i + 3) & ~0x3;
aunque no me sorprendería si los compiladores modernos pudieran descubrir esto último por sí mismos.
myint = (myint + 4) & 0xffffffc
Esto es asumiendo que al "siguiente múltiplo de 4" siempre te mueves hacia arriba; es decir 5 -> 8 y 4 -> 8.
(myint + 3) & ~0x03
La adición de 3 es para que el siguiente múltiplo de 4 se convierta en el múltiplo anterior de 4, que se produce mediante una operación de módulo, que se puede realizar mediante el enmascaramiento, ya que el divisor es una potencia de 2.