2012-07-25 14 views
10

Supongamos que tengo una colección de datos (por ejemplo: cadenas) que deben almacenarse en un archivo binario rellenado para que cada cadena sea, por ejemplo, alineada con 4 bytes.Requiere relleno de cálculo para la alineación n-byte

Así que si tengo una cadena de longitud 11, quedaría acolchada a 12 (con bytes nulos).
Si tengo una cadena de longitud 24, entonces no es necesario relleno.
Si mi cadena tiene una longitud de 6, quedaría acolchada a 8 bytes.

¿Cómo calculo la cantidad de relleno requerido en una sola expresión?

me trataron 4 - (string_length % 4) pero falla cuando mi longitud de la cadena es un múltiplo de 4.

Respuesta

13

Esto parece extraño, pero da la respuesta correcta:

(4 - (string_length % 4)) % 4 
+0

Ah, mod el resultado. No pensé en eso. – MxyL

11

Hay una manera más rápida para calcular el relleno, si la alineación es una potencia de dos (2,4,8, ...). Las siguientes ejecuciones se deben a que el & binario es similar a% para potencias de dos: %(2^x) y &(2^x-1) hacen lo mismo para números positivos. Atención: & eliminará el bit de signo y, por lo tanto, siempre devuelve el resultado del módulo positivo.

Entonces (4 - (string_length & 3)) & 3 hará lo mismo que (4 - (string_length % 4)) % 4. Usando la propiedad de módulo positivo esto se puede simplificar a (-string_length) & 3!


Si quieres añadir ese resultado al tamaño que puede incluso hacer más optimizaciones:

padded_length = (string_length + 3) & ~3 Semánticamente este 'redondea' el número con el tamaño de relleno de 4.

+1

¿Hay un nombre estándar para esta técnica? –

0
public static final int getByteAlignedIndex(final int pVariableDataIndex, final int pVariableDataLength, final int pByteAlignment) { 
    return pVariableDataIndex + (pVariableDataLength & 0xFFFFFFFC) + ((((pVariableDataLength & 0b1)|((pVariableDataLength & 0b10) >> 1))) << 2); 
} 
Cuestiones relacionadas